Sample Characteristics

We collected data from a total of N = 389 participants using a Prolific representative sample that was stratified on the basis of age, sex, ethnicity, and political affiliation. Following our exclusion criteria we had to exclude 28 participants who inferred the wrong category in five or more non-target inference items and one participant who rated their own data to be unfit for analysis. This resulted in N = 360 valid datasets (175 men, 180 women, 4 non-binary, 1 n/a; median age Mdn = 46 years, ranging from 19 to 79). 42% of participants identified as Democrats, 23% as Independents, 33% as Republicans, and 2% as other. According to Prolific demographics, more participants identified as Independents (31% Democrats, 42% Independents, 27% Republicans)–possibly because there was no “Independent” option in our survey. Participants received monetary compensation of 1.20 GBP for completing the 8-minute study. Participants’ mean political ideology was M = 54.6 (SD = 31.6), on a scale from 0 = conservative to 100 = liberal. 80 additional people started the experiment on prolific but returned their submission, timed-out, did not meet the inclusion criteria, or failed the comprehension check.

Exclusion of Statistical Outliers

We did not preregister exclusion of statistical outliers. However, upon inspection of the data we noticed that there were many data points that were very unlikely to reflect true inferences. That is, some participants in both the stereotype-disconfirming and the stereotype-confirming condition seemed to infer categories from opinions that are stereotypically associated with the opposing category (e.g., inferring from a pro-gun control opinion that the person must be a Republican). We assume that such responses are likely due to the participants understanding the items the wrong way around or responding at random. To investigate the potential effect of these outliers we conducted additional analyses excluding them. Theoretically, any values below the scale midpoint (50) are very unlikely to reflect genuine inferences, because they would indicate that the category that is not stereotypically associated with the opinion is more likely to express the opinion than the category that is stereotypically associated with it. While it would therefore seem appropriate to exclude any values below 50, we decided to exclude values below 40, to account for the fact that participants may respond somewhat inaccurately using the sliding scale. For the main analyses we report tests with and without this exclusion criterion.

A similar problem occurred for the stereotype measure on which some participant indicated that category members would on average strongly disagree with opinions that are stereotypical for their category. However, for this measure there is less of a clear cutoff, because even an opinion that is very stereotypical or diagnostic for a category must not be shared by a majority of its members (as long as it is shared by considerably less members of the opposing category). To nevertheless investigate the effect of these outliers we conducted a multiverse analysis using several different cutoff criteria.

Manipulation Check

Stereotype ~ Typicality * Category Type

# Stereotype data
stereo_dat <- dat %>%
  filter(item_type == "target") %>%
  filter(diagnosticity_component == "COUNTERPROB")

Outlier Detection

stereo_dat %>%
  ggplot(., aes(typicality, stereo, color = category_type)) +
  geom_boxplot(outlier.shape = NA) +
  geom_point(position = position_jitterdodge()) +
  labs(x = "Typicality", y = "Stereotype", color = "Category Type") +
  scale_color_manual(values = c("#849AB9", "#465263")) +
  theme_cs_talk()

Multiverse Outlier Correction

# Loop over all combinations of cutoffs and transformations
mv_stereo <- data.frame(
  cutoff = c("none", "fixed 1", "fixed 10", "fixed 20", "fixed 30", "fixed 40"),
  cutoff_value = c(0, 1, 10, 20, 30, 40))
for (c in seq_len(nrow(mv_stereo))) {
  mv_dat <- stereo_dat %>%
    filter(stereo >= mv_stereo$cutoff_value[c])

  # Run ANOVA
  mv_mod <- mv_dat %>%
    anova_test(dv = stereo,
      effect.size = "pes",
      between = c(category_type, typicality)) %>%
    as_tibble() %>%
    rowwise() %>%
    mutate(F = forma(`F`, 2), p = formp(p), pes = forma(pes, 3, FALSE))

  # Save test statistics for h1
  mv_stereo$`n excluded`[c] <-
    nrow(stereo_dat) - nrow(mv_dat)
  mv_stereo$ct_DFn[c] <- mv_mod$DFn[1]
  mv_stereo$ct_DFd[c] <- mv_mod$DFd[1]
  mv_stereo$ct_F[c] <- mv_mod$F[1]
  mv_stereo$ct_p[c] <- mv_mod$p[1]
  mv_stereo$ct_pes[c] <- mv_mod$pes[1]
  mv_stereo$typ_DFn[c] <- mv_mod$DFn[2]
  mv_stereo$typ_DFd[c] <- mv_mod$DFd[2]
  mv_stereo$typ_F[c] <- mv_mod$F[2]
  mv_stereo$typ_p[c] <- mv_mod$p[2]
  mv_stereo$typ_pes[c] <- mv_mod$pes[2]
  mv_stereo$int_DFn[c] <- mv_mod$DFn[3]
  mv_stereo$int_DFd[c] <- mv_mod$DFd[3]
  mv_stereo$int_F[c] <- mv_mod$F[3]
  mv_stereo$int_p[c] <- mv_mod$p[3]
  mv_stereo$int_pes[c] <- mv_mod$pes[3]
}
# Print multiverse table
knitr::kable(select(mv_stereo, - cutoff_value),
  format = "markdown")
cutoff n excluded ct_DFn ct_DFd ct_F ct_p ct_pes typ_DFn typ_DFd typ_F typ_p typ_pes int_DFn int_DFd int_F int_p int_pes
none 0 1 356 0.01 .918 .000 1 356 3.32 .069 .009 1 356 0.58 .447 .002
fixed 1 13 1 343 0.06 .800 .000 1 343 7.62 .006 .022 1 343 2.41 .121 .007
fixed 10 19 1 337 0.00 .996 .000 1 337 7.01 .009 .020 1 337 1.89 .171 .006
fixed 20 33 1 323 0.13 .718 .000 1 323 10.81 .001 .032 1 323 0.03 .871 .000
fixed 30 59 1 297 1.43 .233 .005 1 297 6.71 .010 .022 1 297 0.32 .570 .001
fixed 40 70 1 286 0.29 .591 .001 1 286 5.85 .016 .020 1 286 0.52 .471 .002

To test whether the manipulation was successful, we conducted a multiverse analysis with multiple fixed outlier cutoffs. We excluded participants with values below 1, 10, 20, 30, or 40 and conducted a two-way between-subjects ANOVA with the stereotype measure as the dependent variable and typicality and category type as between-subjects factors. The effect of typicality was marginally significant with no outlier exclusion and significant with all different outlier thresholds. The effect of category type and the two-way interaction were not significant in any of the tests. These results provide moderate support for the effectiveness of our manipulation.

QQ-Plot

stereo_dat %>%
  ggplot(., aes(sample = stereo)) +
  labs(x = "Theoretical quantiles", y = "Data quantiles") +
  stat_qq(color = "#000000") +
  stat_qq_line(color = "#000000") +
  facet_grid(category_type ~ typicality, labeller = "label_value") +
  theme_cs_talk()

Party Categories

Counterstereotype Probability

# PREREGISTERED
# Inference data
inf_dat <- dat %>%
  filter(diagnosticity_component == "COUNTERPROB") %>%
  filter(category_type == "PARTY") %>%
  filter(item_type == "target")

# Descriptives
inf_desc <- inf_dat %>%
  group_by(typicality) %>%
  get_summary_stats(inf, type = "mean_sd") %>%
  mutate(
    ci95_low = mean - 1.96 * sd / sqrt(n),
    ci95_upp = mean + 1.96 * sd / sqrt(n))

# Independent samples t-test
inf_t <- inf_dat %>%
  t_test(
    inf ~ typicality,
    alternative = "less",
    ref.group = "DIS") %>%
  mutate(p = formp(p, text = TRUE), df = forma(df, 2),
    statistic = forma(statistic))

# Cohens d
inf_d <- inf_dat %>%
  cohens_d(inf ~ typicality, paired = FALSE) %>%
  pull(effsize) %>%
  forma()

# Print t-test
inf_report <- paste0("t(", inf_t$df, ") = ",
  inf_t$statistic, ", ", inf_t$p, ", d = ",
  inf_d)

# WITH OUTLIER EXCLUSION
# Exclude outliers
inf_dat_ex <- inf_dat %>%
  filter(inf >= 40)

# Descriptives
inf_ex_desc <- inf_dat_ex %>%
  group_by(typicality) %>%
  get_summary_stats(inf, type = "mean_sd") %>%
  mutate(
    ci95_low = mean - 1.96 * sd / sqrt(n),
    ci95_upp = mean + 1.96 * sd / sqrt(n))

# Independent samples t-test
inf_ex_t <- inf_dat_ex %>%
  t_test(
    inf ~ typicality,
    alternative = "less",
    ref.group = "DIS") %>%
  mutate(p = formp(p, text = TRUE), df = forma(df, 2),
    statistic = forma(statistic))

# Cohens d
inf_ex_d <- inf_dat_ex %>%
  cohens_d(inf ~ typicality, paired = FALSE) %>%
  pull(effsize) %>%
  forma()

# Print t-test
inf_ex_report <- paste0("t(", inf_ex_t$df, ") = ",
  inf_ex_t$statistic, ", ", inf_ex_t$p, ", d = ",
  inf_ex_d)

# WILCOXON
# One-sided Wilcoxon rank-sum test
inf_wcx <- inf_dat %>%
  wilcox_test(
    inf ~ typicality,
    alternative = "less",
    ref.group = "DIS")

# Wilcoxon effect size r
inf_wcx_r <- inf_dat %>%
  wilcox_effsize(inf ~ typicality,
  ref.group = "DIS") %>%
  pull(effsize)

# Print wilcoxon test
inf_wcx_report <- paste0("Z = ", forma(inf_wcx_r * sqrt(nrow(inf_dat) / 2)),
  ", ", formp(inf_wcx$p, TRUE), ", r = ", forma(inf_wcx_r))

To test our hypothesis in the party category condition, we conducted a preregistered independent samples t-test comparing target inferences of partisanship in the stereotype-confirming and stereotype-disconfirming conditions. The target inferences in the disconfirming condition (M = 77.6, SD = 19.6) were not significantly lower than in the stereotype-confirming condition (M = 81.4, SD = 20.9), t(177.22) = -1.27, p = .104, d = -0.19. To investigate whether this was due to statistical outliers, we conducted another independent samples t-test excluding participants with values below 40. After exclusion, the inferences in the disconfirming condition (M = 80.2, SD = 15.6) were significantly lower than in the confirming condition (M = 85.3, SD = 13.6), t(166.51) = -2.27, p = .012, d = -0.35.

Outlier Detection

inf_dat %>%
  ggplot(., aes(typicality, inf)) +
  geom_boxplot(outlier.shape = NA) +
  geom_jitter(width = 0.2) +
  labs(x = "Typicality", y = "Inferences") +
  theme_cs_talk()

Multiverse Outlier Correction

# Loop over all combinations of cutoffs and transformations
mv <- data.frame(
  cutoff = c("none", "fixed 20", "fixed 30", "fixed 40",
    "Mdn ± 2.5 IQR", "Mdn ± 2.0 IQR", "Mdn ± 1.5 IQR", "Mdn ± 1.0 IQR"),
  cutoff_type = c("fixed", "fixed", "fixed", "fixed",
    "Mdn ± IQR", "Mdn ± IQR", "Mdn ± IQR", "Mdn ± IQR"),
  cutoff_value = c(0, 20, 30, 40, 2.5, 2.0, 1.5, 1.0))
for (c in seq_len(nrow(mv))) {
  if (mv$cutoff_type[c] == "fixed") {
    mv_dat <- inf_dat %>%
      filter(inf >= mv$cutoff_value[c])
  } else if (mv$cutoff_type[c] == "Mdn ± IQR") {
    mv_dat <- inf_dat %>%
      group_by(typicality) %>%
      filter(!is_outlier(inf, coef = mv$cutoff_value[c])) %>%
      ungroup()
  }
  # Independent samples t-test
  mv_t <- mv_dat %>%
    t_test(
      inf ~ typicality,
      alternative = "less",
      ref.group = "DIS") %>%
    mutate(p = formp(p, text = FALSE), df = forma(df, 2),
      statistic = forma(statistic))

  # Cohens d
  mv_d <- mv_dat %>%
    cohens_d(inf ~ typicality) %>%
    pull(effsize) %>%
    forma()

  # Save test statistics for h1
  mv$`n excluded`[c] <- nrow(inf_dat) - nrow(mv_dat)
  mv$df[c] <- mv_t$df
  mv$t[c] <- mv_t$statistic
  mv$p[c] <- mv_t$p
  mv$d[c] <- mv_d
}
# Print multiverse table
knitr::kable(select(mv, -cutoff_type, - cutoff_value), format = "markdown")
cutoff n excluded df t p d
none 0 177.22 -1.27 .104 -0.19
fixed 20 5 172.69 -1.91 .029 -0.29
fixed 30 7 169.77 -2.10 .018 -0.32
fixed 40 9 166.51 -2.27 .012 -0.35
Mdn ± 2.5 IQR 2 174.93 -1.98 .025 -0.30
Mdn ± 2.0 IQR 6 169.41 -2.30 .011 -0.35
Mdn ± 1.5 IQR 8 166.04 -2.45 .008 -0.37
Mdn ± 1.0 IQR 13 153.30 -3.32 <.001 -0.51

To investigate the robustness of the effect across various outlier exclusion criteria, we conducted a multiverse analysis. We performed independent samples t-tests across several fixed and distribution-based thresholds. For the fixed thresholds we excluded ratings below 15, 30, or 45 uniformly across both experimental conditions. For the distribution-based criteria we excluded ratings that were 1.0, 1.5, 2.0, or 2.5 times the IQR above or below the condition median. The effect was significant across all seven thresholds. These results suggest that the effect may have been obscured due to model outliers. However, removing outliers may also have introduced bias, for instance if we inadvertantly removed more true model outliers in one of the two experimental conditions. This risk is especially high with the distribution-based thresholds we used: If in the disconfirming condition the distribution of inferences is shifted towards the scale midpoint, this would make low outliers more difficult to detect (due to a floor effect). Thus, applying the thresholds may have artificially inflated the effect by predominantly removing low outliers in the confirming condition. As this risk is reduced by the fixed thresholds, these provide a more conservative estimate of the true effect.

Although these results suggest that there may be an effect of typicality on inferences of partisanship, this effect seems to be considerably smaller and less robust compared to the previous study. This may be because we removed the pre-measurement and changed the cover story. As we have argued above, the repeated-measures design made it very easy to infer our research hypothesis. Part of the observed effect in the previous study may therefore have been the consequence of demand effects. Another possibility is that measuring the inferences before presenting the counterstereotypical exemplar led to an activation of the relevant knowledge structures and therefore facilitated the learning of the new information. However, as neither demand characteristics nor pre-activation of the relevant knowledge structures will be present when we come across a counterstereotype in real life, the effects of the current study may provide a more realistic estimate of the change in inferences that is induced by counterstereotypes.

QQ-Plot

inf_dat_ex %>%
  ggplot(., aes(sample = inf)) +
  labs(x = "Theoretical quantiles", y = "Data quantiles") +
  stat_qq(color = "#000000") +
  stat_qq_line(color = "#000000") +
  facet_grid(~ typicality, labeller = "label_value") +
  theme_cs_talk()

Descriptives

knitr::kable(inf_desc, format = "markdown")
typicality variable n mean sd ci95_low ci95_upp
DIS inf 90 77.600 19.569 73.55700 81.64300
CON inf 90 81.422 20.913 77.10133 85.74267

Histogram

inf_dat_ex %>%
  mutate(inf_bin = cut(inf,
    breaks = 9, labels = FALSE, include.lowest = TRUE)) %>%
  ggplot() +
  geom_bar(position = position_dodge(preserve = "single"),
  aes(x = inf_bin, y = after_stat(prop), fill = typicality),
    width = 0.8) +
  labs(title = "Histogramm of Inference Scores",
    x = "Inference Scores",
    y = "Proportion", fill = "Typicality") +
  scale_fill_manual(values = c("#849AB9", "#465263")) +
  theme_cs_talk() +
  theme(axis.text.x = element_blank())

Moderation by partisanship

# Prepare data
inf_par_dat <- inf_dat_ex %>%
  # Select participants who identify as Republican, Democrat, or Independent
  filter(partisan_identity %in% c("Republican", "Democrat", "Independent"))

# Descriptives
inf_par_desc <- inf_par_dat %>%
  group_by(partisan_identity, typicality) %>%
  get_summary_stats(inf, type = "mean_sd") %>%
  mutate(
    ci95_low = mean - 1.96 * sd / sqrt(n),
    ci95_upp = mean + 1.96 * sd / sqrt(n))

# Run ANOVA
inf_par_mod <- inf_par_dat %>%
  anova_test(dv = inf,
    effect.size = "pes",
    between = c(partisan_identity, typicality)) %>%
  as_tibble() %>%
  rowwise() %>%
  mutate(F = forma(`F`, 2), p = formp(p), pes = forma(pes, 3, FALSE))

knitr::kable(inf_par_mod, format = "markdown")
Effect DFn DFd F p p<.05 pes
partisan_identity 2 161 1.66 .193 .020
typicality 1 161 6.13 .014 * .037
partisan_identity:typicality 2 161 0.49 .616 .006

It may be possible that the effect of diagnosticity on the inferences depends on the participant’s partisanship. To test this, we conducted a two-way between-subjects ANOVA with the target inference as the dependent variable and the participants’ party identification and typicality as between-subjects factors. We found a significant effect of typicality. All other effects were non-significant.

Moderation by partisan fit

# Prepare data
inf_par_fit_dat <- inf_dat_ex %>%
  # Select participants who identify with one of the major parties
  filter(partisan_identity %in% c("Republican", "Democrat")) %>%
  # Recode partisan identity
  mutate(partisan_identity = case_match(partisan_identity,
    "Democrat" ~ "DEM", "Republican" ~ "REP")) %>%
  mutate(partisan_fit = as.factor(ifelse(
    partisan_identity == target_category_label,
    "same", "different")))

# Descriptives
inf_par_fit_desc <- inf_par_fit_dat %>%
  group_by(partisan_fit, typicality) %>%
  get_summary_stats(inf, type = "mean_sd") %>%
  mutate(
    ci95_low = mean - 1.96 * sd / sqrt(n),
    ci95_upp = mean + 1.96 * sd / sqrt(n))

# Run ANOVA
inf_par_fit_mod <- inf_par_fit_dat %>%
  anova_test(dv = inf,
    effect.size = "pes",
    between = c(partisan_fit, typicality)) %>%
  as_tibble() %>%
  rowwise() %>%
  mutate(F = forma(`F`, 2), p = formp(p), pes = forma(pes, 3, FALSE))

knitr::kable(inf_par_fit_mod, format = "markdown")
Effect DFn DFd F p p<.05 pes
partisan_fit 1 122 0.00 .976 .000
typicality 1 122 6.32 .013 * .049
partisan_fit:typicality 1 122 0.42 .520 .003

It may be possible that the effect of diagnosticity on the inferences depends on the fit between the participant’s party identification and the target’s partisanship. We therefore ran an exploratory analysis examining the role of ideological fit (i.e., whether participant and target belong to the same category or a different one). We excluded participants classified as Independents and conducted a two-way between-subjects ANOVA with the target inference as the dependent variable and ideological fit and typicality as between-subjects factors. We found a significant effect of typicality. All other effects were non-significant.

Moderation by political issue

# Descriptives
inf_issue_desc <- inf_dat_ex %>%
  group_by(issue, typicality) %>%
  get_summary_stats(inf, type = "mean_sd") %>%
  mutate(
    ci95_low = mean - 1.96 * sd / sqrt(n),
    ci95_upp = mean + 1.96 * sd / sqrt(n))

# Run ANOVA
inf_issue_mod <- inf_dat_ex %>%
  anova_test(dv = inf,
    effect.size = "pes",
    between = c(issue, typicality)) %>%
  as_tibble() %>%
  rowwise() %>%
  mutate(F = forma(`F`, 2), p = formp(p), pes = forma(pes, 3, FALSE))

knitr::kable(inf_issue_mod, format = "markdown")
Effect DFn DFd F p p<.05 pes
issue 2 165 2.54 .082 .030
typicality 1 165 5.53 .020 * .032
issue:typicality 2 165 0.67 .513 .008

We ran another exploratory analysis to test whether the effect of diagnosticity on the inferences was moderated by the issue for which diagnosticity was manipulated. We conducted a two-way between-subjects ANOVA with the target inference as the dependent variable and issue and typicality as between-subjects factors. We found a significant effect of typicality. All other effects were non-significant.

Moderation by typicality rating

inf_typ_dat <- inf_dat_ex %>%
  group_by(typicality) %>%
  mutate(typicality_bin = ntile(typicality_target, 2)) %>%
  mutate(typicality_bin = factor(typicality_bin, labels = c("low", "high"))) %>%
  ungroup() %>%
  mutate(typicality_target_c = typicality_target - mean(typicality_target))
# DV: Typicality
# Descriptives
typ_desc <- inf_typ_dat %>%
  group_by(typicality) %>%
  get_summary_stats(typicality_target, type = "mean_sd") %>%
  mutate(
    ci95_low = mean - 1.96 * sd / sqrt(n),
    ci95_upp = mean + 1.96 * sd / sqrt(n))

# Independent samples t-test
typ_t <- inf_typ_dat %>%
  t_test(
    typicality_target ~ typicality,
    alternative = "less",
    ref.group = "DIS") %>%
  mutate(p = formp(p, text = TRUE), df = forma(df, 2),
    statistic = forma(statistic))

# Cohens d
typ_d <- inf_typ_dat %>%
  cohens_d(typicality_target ~ typicality, paired = FALSE) %>%
  pull(effsize) %>%
  forma()

# Print t-test
typ_report <- paste0("t(", typ_t$df, ") = ",
  typ_t$statistic, ", ", typ_t$p, ", d = ",
  typ_d)

# DV: Inferences
inf_typ_desc <- inf_typ_dat %>%
  group_by(typicality_bin, typicality) %>%
  get_summary_stats(inf, type = "mean_sd") %>%
  mutate(
    ci95_low = mean - 1.96 * sd / sqrt(n),
    ci95_upp = mean + 1.96 * sd / sqrt(n))

# Run regression
contrasts(inf_typ_dat$typicality) <- c(1, 0)
inf_typ_mod <- lm(
    data = inf_typ_dat,
    inf ~ typicality * typicality_target_c)
inf_typ_mod_coefs <- summary(inf_typ_mod)$coefficients %>%
  as_tibble() %>%
  rowwise() %>%
  transmute(
    predictor = "var", estimate = forma(`Estimate`, 2),
    SE = forma(`Std. Error`, 2), t = forma(`t value`, 2),
    p = formp(`Pr(>|t|)`)) %>%
  ungroup() %>%
  mutate(predictor = c("intercept", "typicality CON -> DIS",
    "typicality rating LOW -> HIGH", "interaction"))

knitr::kable(inf_typ_mod_coefs, format = "markdown")
predictor estimate SE t p
intercept 81.17 2.04 39.72 <.001
typicality CON -> DIS -1.86 2.71 -0.68 .495
typicality rating LOW -> HIGH 0.29 0.10 3.09 .002
interaction -0.36 0.12 -3.11 .002
# Plot
inf_typ_dat %>%
  ggplot(aes(x = typicality_target, y = inf, color = typicality)) +
  geom_point(alpha = 0.6) +
  geom_smooth(method = "lm", se = TRUE,
    aes(group = typicality)) +
  labs(
    title = "Moderation by typicality rating",
    x = "Typicality rating",
    y = "Inference",
    color = "Typicality") +
  scale_color_manual(values = c("#2d85ff", "#28ea96")) +
  theme_cs_talk()

The target person’s perceived typicality in the disconfirming condition (M = 53.6, SD = 23.9) was significantly lower than in the confirming condition (M = 81.4, SD = 16.4), t(150.95) = -8.88, p < .001, d = -1.36. To explore the effect of the typicality ratings, we ran a linear regression model with the inferences as the dependent variable and typicality, the typicality rating, and the interaction as the predictors. We used treatment-coding for typicality and centered the typicality ratings. The overall model was significant, F(3, 167) = 5.31, p = .002, R2 = .087. The main effect of typicality was not significant, b = -1.86, SE = 2.71, t(167) = -0.68, p = .495. The main effect of perceived typicality was significant, b = 0.29, SE = 0.10, t(167) = 3.09, p = .002, indicating that in the stereotype-confirming condition higher perceived typicality was associated with stronger inferences. Importantly, the interaction effect was significant, b = -0.36, SE = 0.12, t(167) = -3.11, p = .002. This interaction indicates that in the disconfirming condition, a higher perceived typicality is associated with reduced inferences compared to the confirming condition.

Stereotype Probability

# Inference data
inf_stereoprob_dat <- dat %>%
  filter(diagnosticity_component == "STEREOPROB") %>%
  filter(category_type == "PARTY") %>%
  filter(item_type == "target")

# Descriptives
inf_stereoprob_desc <- inf_stereoprob_dat %>%
  group_by(typicality) %>%
  get_summary_stats(inf, type = "mean_sd") %>%
  mutate(
    ci95_low = mean - 1.96 * sd / sqrt(n),
    ci95_upp = mean + 1.96 * sd / sqrt(n))

# Independent samples t-test
inf_stereoprob_t <- inf_stereoprob_dat %>%
  t_test(
    inf ~ typicality,
    alternative = "less",
    ref.group = "DIS") %>%
  mutate(p = formp(p, text = TRUE), df = forma(df, 2),
    statistic = forma(statistic))

# Cohens d
inf_stereoprob_d <- inf_stereoprob_dat %>%
  cohens_d(inf ~ typicality, paired = FALSE) %>%
  pull(effsize) %>%
  forma()

# Print t-test
inf_stereoprob_report <- paste0("t(", inf_stereoprob_t$df, ") = ",
  inf_stereoprob_t$statistic, ", ", inf_stereoprob_t$p, ", d = ",
  inf_stereoprob_d)

# EXCLUDE OUTLIERS
inf_stereoprob_dat_ex <- inf_stereoprob_dat %>%
  filter(inf >= 40)

# Descriptives
inf_stereoprob_ex_desc <- inf_stereoprob_dat_ex %>%
  group_by(typicality) %>%
  get_summary_stats(inf, type = "mean_sd") %>%
  mutate(
    ci95_low = mean - 1.96 * sd / sqrt(n),
    ci95_upp = mean + 1.96 * sd / sqrt(n))

# Independent samples t-test
inf_stereoprob_ex_t <- inf_stereoprob_dat_ex %>%
  t_test(
    inf ~ typicality,
    alternative = "less",
    ref.group = "DIS") %>%
  mutate(p = formp(p, text = TRUE), df = forma(df, 2),
    statistic = forma(statistic))

# Cohens d
inf_stereoprob_ex_d <- inf_stereoprob_dat_ex %>%
  cohens_d(inf ~ typicality, paired = FALSE) %>%
  pull(effsize) %>%
  forma()

# Print t-test
inf_stereoprob_ex_report <- paste0("t(", inf_stereoprob_ex_t$df, ") = ",
  inf_stereoprob_ex_t$statistic, ", ", inf_stereoprob_ex_t$p, ", d = ",
  inf_stereoprob_ex_d)

# WILCOXON
# One-sided Wilcoxon rank-sum test
inf_stereoprob_wcx <- inf_stereoprob_dat %>%
  wilcox_test(
    inf ~ typicality,
    alternative = "less",
    ref.group = "DIS")

# Wilcoxon effect size r
inf_stereoprob_wcx_r <- inf_stereoprob_dat %>%
  wilcox_effsize(inf ~ typicality,
  ref.group = "DIS") %>%
  pull(effsize)

# Print wilcoxon test
inf_stereoprob_wcx_report <- paste0("Z = ",
  forma(inf_stereoprob_wcx_r * sqrt(nrow(inf_stereoprob_dat) / 2)),
  ", ", formp(inf_stereoprob_wcx$p, TRUE), ", r = ", forma(inf_stereoprob_wcx_r))

To test the effect of manipulating the stereotype probability component of diagnosticity on inferences of partisanship, we conducted an exploratory independent samples t-test comparing target inferences of partisanship in the stereotype-confirming and stereotype-disconfirming conditions. The target inferences in the disconfirming condition (M = 80.2, SD = 22.2) were not significantly lower than in the stereotype-confirming condition (M = 80.4, SD = 24.5), t(176.35) = -0.064, p = .475, d = -0.010. To investigate whether this was due to statistical outliers, we conducted another independent samples t-test excluding participants with values below 40. After exclusion, the inferences in the disconfirming condition (M = 84.7, SD = 14.8) were still not significantly lower than in the confirming condition (M = 87.4, SD = 13.0), t(161.53) = -1.23, p = .110, d = -0.19.

Outlier Detection

inf_stereoprob_dat %>%
  ggplot(., aes(typicality, inf)) +
  geom_boxplot(outlier.shape = NA) +
  geom_jitter(width = 0.2) +
  labs(x = "Typicality", y = "Inferences") +
  theme_cs_talk()

Multiverse Outlier Correction

# Loop over all combinations of cutoffs and transformations
mv_stereoprob <- data.frame(
  cutoff = c("none", "fixed 20", "fixed 30", "fixed 40",
    "Mdn ± 2.5 IQR", "Mdn ± 2.0 IQR", "Mdn ± 1.5 IQR", "Mdn ± 1.0 IQR"),
  cutoff_type = c("fixed", "fixed", "fixed", "fixed",
    "Mdn ± IQR", "Mdn ± IQR", "Mdn ± IQR", "Mdn ± IQR"),
  cutoff_value = c(0, 20, 30, 40, 2.5, 2.0, 1.5, 1.0))
for (c in seq_len(nrow(mv_stereoprob))) {
  if (mv_stereoprob$cutoff_type[c] == "fixed") {
    mv_dat <- inf_stereoprob_dat %>%
      filter(inf >= mv_stereoprob$cutoff_value[c])
  } else if (mv_stereoprob$cutoff_type[c] == "Mdn ± IQR") {
    mv_dat <- inf_stereoprob_dat %>%
      group_by(typicality) %>%
      filter(!is_outlier(inf, coef = mv_stereoprob$cutoff_value[c])) %>%
      ungroup()
  }
  # Independent samples t-test
  mv_t <- mv_dat %>%
    t_test(
      inf ~ typicality,
      alternative = "less",
      ref.group = "DIS") %>%
    mutate(p = formp(p, text = FALSE), df = forma(df, 2),
      statistic = forma(statistic))

  # Cohens d
  mv_d <- mv_dat %>%
    cohens_d(inf ~ typicality) %>%
    pull(effsize) %>%
    forma()

  # Save test statistics for h1
  mv_stereoprob$`n excluded`[c] <- nrow(inf_stereoprob_dat) - nrow(mv_dat)
  mv_stereoprob$df[c] <- mv_t$df
  mv_stereoprob$t[c] <- mv_t$statistic
  mv_stereoprob$p[c] <- mv_t$p
  mv_stereoprob$d[c] <- mv_d
}
# Print multiverse table
knitr::kable(select(mv_stereoprob, -cutoff_type, - cutoff_value),
  format = "markdown")
cutoff n excluded df t p d
none 0 176.35 -0.064 .475 -0.010
fixed 20 8 169.99 -0.70 .243 -0.11
fixed 30 13 164.77 -0.60 .275 -0.093
fixed 40 15 161.53 -1.23 .110 -0.19
Mdn ± 2.5 IQR 3 174.34 -0.34 .366 -0.052
Mdn ± 2.0 IQR 9 168.50 -1.01 .158 -0.15
Mdn ± 1.5 IQR 14 163.79 -0.93 .177 -0.14
Mdn ± 1.0 IQR 16 161.45 -1.01 .157 -0.16

To investigate the robustness of the effect across various outlier exclusion criteria, we conducted a multiverse analysis. We again performed independent samples t-tests across several fixed and distribution-based thresholds. The effect was non-significant across all seven thresholds. These results suggest that manipulating the stereotype probability has no effect on inferences of partisanship.

QQ-Plot

inf_stereoprob_dat %>%
  ggplot(., aes(sample = inf)) +
  labs(x = "Theoretical quantiles", y = "Data quantiles") +
  stat_qq(color = "#000000") +
  stat_qq_line(color = "#000000") +
  facet_grid(~ typicality, labeller = "label_value") +
  theme_cs_talk()

Descriptives

knitr::kable(inf_stereoprob_desc, format = "markdown")
typicality variable n mean sd ci95_low ci95_upp
DIS inf 90 80.222 22.219 75.63151 84.81249
CON inf 90 80.444 24.485 75.38535 85.50265

Histogram

inf_stereoprob_dat %>%
  mutate(inf_bin = cut(inf,
    breaks = 9, labels = FALSE, include.lowest = TRUE)) %>%
  ggplot() +
  geom_bar(position = position_dodge(preserve = "single"),
  aes(x = inf_bin, y = after_stat(prop), fill = typicality),
    width = 0.8) +
  labs(title = "Histogramm of Inference Scores",
    x = "Inference Scores",
    y = "Proportion", fill = "Typicality") +
  scale_fill_manual(values = c("#849AB9", "#465263")) +
  theme_cs_talk() +
  theme(axis.text.x = element_blank())

Ideological Categories

Counterstereotype Probability

# PREREGISTERED
# Inference data
inf_ideo_dat <- dat %>%
  filter(diagnosticity_component == "COUNTERPROB") %>%
  filter(category_type == "IDEOLOGICAL") %>%
  filter(item_type == "target")

# Descriptives
inf_ideo_desc <- inf_ideo_dat %>%
  group_by(typicality) %>%
  get_summary_stats(inf, type = "mean_sd") %>%
  mutate(
    ci95_low = mean - 1.96 * sd / sqrt(n),
    ci95_upp = mean + 1.96 * sd / sqrt(n))

# Independent samples t-test
inf_ideo_t <- inf_ideo_dat %>%
  t_test(
    inf ~ typicality,
    alternative = "less",
    ref.group = "DIS") %>%
  mutate(p = formp(p, text = TRUE), df = forma(df, 2),
    statistic = forma(statistic))

# Cohens d
inf_ideo_d <- inf_ideo_dat %>%
  cohens_d(inf ~ typicality, paired = FALSE) %>%
  pull(effsize) %>%
  forma()

# Print t-test
inf_ideo_report <- paste0("t(", inf_ideo_t$df, ") = ",
  inf_ideo_t$statistic, ", ", inf_ideo_t$p, ", d = ",
  inf_ideo_d)

# EXCLUDE OUTLIERS
inf_ideo_dat_ex <- inf_ideo_dat %>%
  filter(inf >= 40)

# Descriptives
inf_ideo_ex_desc <- inf_ideo_dat_ex %>%
  group_by(typicality) %>%
  get_summary_stats(inf, type = "mean_sd") %>%
  mutate(
    ci95_low = mean - 1.96 * sd / sqrt(n),
    ci95_upp = mean + 1.96 * sd / sqrt(n))

# Independent samples t-test
inf_ideo_ex_t <- inf_ideo_dat_ex %>%
  t_test(
    inf ~ typicality,
    alternative = "less",
    ref.group = "DIS") %>%
  mutate(p = formp(p, text = TRUE), df = forma(df, 2),
    statistic = forma(statistic))

# Cohens d
inf_ideo_ex_d <- inf_ideo_dat_ex %>%
  cohens_d(inf ~ typicality, paired = FALSE) %>%
  pull(effsize) %>%
  forma()

# Print t-test
inf_ideo_ex_report <- paste0("t(", inf_ideo_ex_t$df, ") = ",
  inf_ideo_ex_t$statistic, ", ", inf_ideo_ex_t$p, ", d = ",
  inf_ideo_ex_d)

# WILCOXON
# One-sided Wilcoxon rank-sum test
inf_ideo_wcx <- inf_ideo_dat %>%
  wilcox_test(
    inf ~ typicality,
    alternative = "less",
    ref.group = "DIS")

# Wilcoxon effect size r
inf_ideo_wcx_r <- inf_ideo_dat %>%
  wilcox_effsize(inf ~ typicality,
  ref.group = "DIS") %>%
  pull(effsize)

# Print wilcoxon test
inf_ideo_wcx_report <- paste0("Z = ",
  forma(inf_ideo_wcx_r * sqrt(nrow(inf_ideo_dat) / 2)),
  ", ", formp(inf_ideo_wcx$p, TRUE), ", r = ", forma(inf_ideo_wcx_r))

To test our hypothesis in the ideological category condition, we conducted a preregistered independent samples t-test comparing target inferences of ideological categories in the stereotype-confirming and stereotype-disconfirming conditions. The target inferences in the disconfirming condition (M = 79.0, SD = 17.4) were not significantly lower than in the stereotype-confirming condition (M = 81.7, SD = 20.4), t(173.75) = -0.96, p = .168, d = -0.14. To investigate whether this was due to statistical outliers, we conducted another independent samples t-test excluding participants with values below 40. After exclusion, the inferences in the disconfirming condition (M = 80.1, SD = 16.0) were significantly lower than in the confirming condition (M = 86.0, SD = 12.9), t(165.59) = -2.66, p = .004, d = -0.41.

Outlier Detection

inf_ideo_dat %>%
  ggplot(., aes(typicality, inf)) +
  geom_boxplot(outlier.shape = NA) +
  geom_jitter(width = 0.2) +
  labs(x = "Typicality", y = "Inferences") +
  theme_cs_talk()

Multiverse Outlier Correction

# Loop over all combinations of cutoffs and transformations
mv_ideo <- data.frame(
  cutoff = c("none", "fixed 20", "fixed 30", "fixed 40",
    "Mdn ± 2.5 IQR", "Mdn ± 2.0 IQR", "Mdn ± 1.5 IQR", "Mdn ± 1.0 IQR"),
  cutoff_type = c("fixed", "fixed", "fixed", "fixed",
    "Mdn ± IQR", "Mdn ± IQR", "Mdn ± IQR", "Mdn ± IQR"),
  cutoff_value = c(0, 20, 30, 40, 2.5, 2.0, 1.5, 1.0))
for (c in seq_len(nrow(mv_ideo))) {
  if (mv_ideo$cutoff_type[c] == "fixed") {
    mv_dat <- inf_ideo_dat %>%
      filter(inf >= mv_ideo$cutoff_value[c])
  } else if (mv_ideo$cutoff_type[c] == "Mdn ± IQR") {
    mv_dat <- inf_ideo_dat %>%
      group_by(typicality) %>%
      filter(!is_outlier(inf, coef = mv_ideo$cutoff_value[c])) %>%
      ungroup()
  }
  # Independent samples t-test
  mv_t <- mv_dat %>%
    t_test(
      inf ~ typicality,
      alternative = "less",
      ref.group = "DIS") %>%
    mutate(p = formp(p, text = FALSE), df = forma(df, 2),
      statistic = forma(statistic))

  # Cohens d
  mv_d <- mv_dat %>%
    cohens_d(inf ~ typicality) %>%
    pull(effsize) %>%
    forma()

  # Save test statistics for h1
  mv_ideo$`n excluded`[c] <- nrow(inf_ideo_dat) - nrow(mv_dat)
  mv_ideo$df[c] <- mv_t$df
  mv_ideo$t[c] <- mv_t$statistic
  mv_ideo$p[c] <- mv_t$p
  mv_ideo$d[c] <- mv_d
}
# Print multiverse table
knitr::kable(select(mv_ideo, -cutoff_type, - cutoff_value), format = "markdown")
cutoff n excluded df t p d
none 0 173.75 -0.96 .168 -0.14
fixed 20 3 174.91 -1.97 .025 -0.30
fixed 30 5 172.58 -2.13 .017 -0.32
fixed 40 8 165.59 -2.66 .004 -0.41
Mdn ± 2.5 IQR 3 174.91 -1.97 .025 -0.30
Mdn ± 2.0 IQR 5 168.98 -2.66 .004 -0.40
Mdn ± 1.5 IQR 8 160.39 -3.16 <.001 -0.48
Mdn ± 1.0 IQR 9 160.81 -3.00 .002 -0.46

To investigate the robustness of the effect across various outlier exclusion criteria, we conducted a multiverse analysis. We again performed independent samples t-tests across several fixed and distribution-based thresholds. The effect was significant across all seven thresholds. These results again suggest that the effect may have been obscured due to model outliers.

QQ-Plot

inf_ideo_dat_ex %>%
  ggplot(., aes(sample = inf)) +
  labs(x = "Theoretical quantiles", y = "Data quantiles") +
  stat_qq(color = "#000000") +
  stat_qq_line(color = "#000000") +
  facet_grid(~ typicality, labeller = "label_value") +
  theme_cs_talk()

Descriptives

knitr::kable(inf_ideo_desc, format = "markdown")
typicality variable n mean sd ci95_low ci95_upp
DIS inf 90 79.022 17.417 75.42361 82.62039
CON inf 90 81.744 20.391 77.53118 85.95682

Histogram

inf_ideo_dat_ex %>%
  mutate(inf_bin = cut(inf,
    breaks = 9, labels = FALSE, include.lowest = TRUE)) %>%
  ggplot() +
  geom_bar(position = position_dodge(preserve = "single"),
  aes(x = inf_bin, y = after_stat(prop), fill = typicality),
    width = 0.8) +
  labs(title = "Histogramm of Inference Scores",
    x = "Inference Scores",
    y = "Proportion", fill = "Typicality") +
  scale_fill_manual(values = c("#849AB9", "#465263")) +
  theme_cs_talk() +
  theme(axis.text.x = element_blank())

Moderation by participant ideology

# Prepare data
inf_ideo_ideo_dat <- inf_ideo_dat_ex %>%
  mutate(ideo_cat = case_when(
    political_ideology < 35 ~ "CON",
    political_ideology > 65 ~ "LIB",
    .default = "MOD"
  ))

# Descriptives
inf_ideo_ideo_desc <- inf_ideo_ideo_dat %>%
  group_by(ideo_cat, typicality) %>%
  get_summary_stats(inf, type = "mean_sd") %>%
  mutate(
    ci95_low = mean - 1.96 * sd / sqrt(n),
    ci95_upp = mean + 1.96 * sd / sqrt(n))

# Run ANOVA
inf_ideo_ideo_mod <- inf_ideo_ideo_dat %>%
  anova_test(dv = inf,
    effect.size = "pes",
    between = c(ideo_cat, typicality)) %>%
  as_tibble() %>%
  rowwise() %>%
  mutate(F = forma(`F`, 2), p = formp(p), pes = forma(pes, 3, FALSE))

knitr::kable(inf_ideo_ideo_mod, format = "markdown")
Effect DFn DFd F p p<.05 pes
ideo_cat 2 166 7.03 .001 * .078
typicality 1 166 6.38 .012 * .037
ideo_cat:typicality 2 166 0.97 .381 .012

It may be possible that the effect of diagnosticity on the inferences depends on the participant’s ideological category. To test this, we categorized participants with an ideology score of below 35 as conservatives, those with a score higher than 65 as liberals, and those in between as moderates and then conducted a two-way between-subjects ANOVA with the target inference as the dependent variable and the participants’ ideological identification and typicality as between-subjects factors. We found a significant effect of ideological category, which was likely driven by lower inference scores of ideological moderates. Moreover, we found a significant effect of typicality.

Moderation by ideological fit

# Prepare data
inf_ideo_fit_dat <- inf_ideo_ideo_dat %>%
  # Select participants who identify as liberal or conservative
  filter(ideo_cat %in% c("CON", "LIB")) %>%
  # Create ideological fit variable
  mutate(ideo_fit = as.factor(ifelse(
    ideo_cat == target_category_label,
    "same", "different")))

# Descriptives
inf_ideo_fit_desc <- inf_ideo_fit_dat %>%
  group_by(ideo_fit, typicality) %>%
  get_summary_stats(inf, type = "mean_sd") %>%
  mutate(
    ci95_low = mean - 1.96 * sd / sqrt(n),
    ci95_upp = mean + 1.96 * sd / sqrt(n))

# Run ANOVA
inf_ideo_fit_mod <- inf_ideo_fit_dat %>%
  anova_test(dv = inf,
    effect.size = "pes",
    between = c(ideo_fit, typicality)) %>%
  as_tibble() %>%
  rowwise() %>%
  mutate(F = forma(`F`, 2), p = formp(p), pes = forma(pes, 3, FALSE))

knitr::kable(inf_ideo_fit_mod, format = "markdown")
Effect DFn DFd F p p<.05 pes
ideo_fit 1 111 0.66 .420 .006
typicality 1 111 2.20 .140 .019
ideo_fit:typicality 1 111 0.78 .378 .007

It may be possible that the effect of diagnosticity on the inferences depends on the fit between the participant’s ideological category and the target’s category. We therefore ran an exploratory analysis examining the role of ideological fit (i.e., whether participant and target belong to the same category or a different one). We excluded participants classified as moderates and conducted a two-way between-subjects ANOVA with the target inference as the dependent variable and ideological fit and typicality as between-subjects factors. None of the effects were significant.

Moderation by political issue

# Descriptives
inf_ideo_issue_desc <- inf_ideo_dat_ex %>%
  group_by(issue, typicality) %>%
  get_summary_stats(inf, type = "mean_sd") %>%
  mutate(
    ci95_low = mean - 1.96 * sd / sqrt(n),
    ci95_upp = mean + 1.96 * sd / sqrt(n))

# Run ANOVA
inf_ideo_issue_mod <- inf_ideo_dat_ex %>%
  anova_test(dv = inf,
    effect.size = "pes",
    between = c(issue, typicality)) %>%
  as_tibble() %>%
  rowwise() %>%
  mutate(F = forma(`F`, 2), p = formp(p), pes = forma(pes, 3, FALSE))

knitr::kable(inf_ideo_issue_mod, format = "markdown")
Effect DFn DFd F p p<.05 pes
issue 2 166 6.42 .002 * .072
typicality 1 166 7.59 .007 * .044
issue:typicality 2 166 0.79 .455 .009

We ran another exploratory analysis to test whether the effect of diagnosticity on the inferences was moderated by the issue for which diagnosticity was manipulated. We conducted a two-way between-subjects ANOVA with the target inference as the dependent variable and issue and typicality as between-subjects factors. We found a significant effect for issue that was likely driven by lower inferences in the affirmative action condition. Moreover, we found a significant effect of typicality. The interaction was not significant.

Moderation by typicality rating

inf_ideo_typ_dat <- inf_ideo_dat_ex %>%
  group_by(typicality) %>%
  mutate(typicality_bin = ntile(typicality_target, 2)) %>%
  mutate(typicality_bin = factor(typicality_bin, labels = c("low", "high"))) %>%
  ungroup() %>%
  mutate(typicality_target_c = typicality_target - mean(typicality_target))

# DV: Typicality
# Descriptives
typ_ideo_desc <- inf_ideo_typ_dat %>%
  group_by(typicality) %>%
  get_summary_stats(typicality_target, type = "mean_sd") %>%
  mutate(
    ci95_low = mean - 1.96 * sd / sqrt(n),
    ci95_upp = mean + 1.96 * sd / sqrt(n))

# Independent samples t-test
typ_ideo_t <- inf_ideo_typ_dat %>%
  t_test(
    typicality_target ~ typicality,
    alternative = "less",
    ref.group = "DIS") %>%
  mutate(p = formp(p, text = TRUE), df = forma(df, 2),
    statistic = forma(statistic))

# Cohens d
typ_ideo_d <- inf_ideo_typ_dat %>%
  cohens_d(typicality_target ~ typicality, paired = FALSE) %>%
  pull(effsize) %>%
  forma()

# Print t-test
typ_ideo_report <- paste0("t(", typ_ideo_t$df, ") = ",
  typ_ideo_t$statistic, ", ", typ_ideo_t$p, ", d = ",
  typ_ideo_d)

# DV: Inferences
inf_ideo_typ_desc <- inf_ideo_typ_dat %>%
  group_by(typicality_bin, typicality) %>%
  get_summary_stats(inf, type = "mean_sd") %>%
  mutate(
    ci95_low = mean - 1.96 * sd / sqrt(n),
    ci95_upp = mean + 1.96 * sd / sqrt(n))

knitr::kable(inf_ideo_typ_desc, format = "markdown")
typicality typicality_bin variable n mean sd ci95_low ci95_upp
DIS low inf 44 79.909 15.138 75.43601 84.38199
CON low inf 42 84.071 11.604 80.56155 87.58045
DIS high inf 44 80.318 16.930 75.31550 85.32050
CON high inf 42 87.929 13.978 83.70157 92.15643
# Run regression
contrasts(inf_ideo_typ_dat$typicality) <- c(1, 0)
inf_ideo_typ_mod <- lm(
    data = inf_ideo_typ_dat,
    inf ~ typicality * typicality_target)
inf_ideo_typ_mod_coefs <- summary(inf_ideo_typ_mod)$coefficients %>%
  as_tibble() %>%
  rowwise() %>%
  transmute(
    predictor = "var", estimate = forma(`Estimate`, 2),
    SE = forma(`Std. Error`, 2), t = forma(`t value`, 2),
    p = formp(`Pr(>|t|)`)) %>%
  ungroup() %>%
  mutate(predictor = c("intercept", "typicality CON -> DIS",
    "typicality rating LOW -> HIGH", "interaction"))

# Plot
inf_ideo_typ_dat %>%
  ggplot(aes(x = typicality_target, y = inf, color = typicality)) +
  geom_point(alpha = 0.6) +
  geom_smooth(method = "lm", se = TRUE,
    aes(group = typicality)) +
  labs(
    title = "Moderation by typicality rating",
    x = "Typicality rating",
    y = "Inference",
    color = "Typicality") +
  scale_color_manual(values = c("#2d85ff", "#28ea96")) +
  theme_cs_talk()

The target person in the disconfirming condition was rated as significantly less typical than in the confirming condition, t(164.67) = -6.91, p < .001, d = -1.05. To explore the effect of the typicality ratings, we ran a linear regression model with the inferences as the dependent variable and typicality, the typicality rating, and the interaction as the predictors. We used treatment-coding for typicality and centered the typicality ratings. The overall model was not significant, F(3, 168) = 2.47, p = .064, R2 = .042. The main effect typicality was not significant, b = -0.52, SE = 8.44, t(168) = -0.06, p = .951. The main effect of the typicality rating was not significant, b = 0.05, SE = 0.09, t(168) = 0.56, p = .578. Lastly, there was no significant interaction, b = -0.07, SE = 0.11, t(168) = -0.66, p = .511.

Stereotype Probability

# Inference data
inf_stereoprob_ideo_dat <- dat %>%
  filter(diagnosticity_component == "STEREOPROB") %>%
  filter(category_type == "IDEOLOGICAL") %>%
  filter(item_type == "target")

# Descriptives
inf_stereoprob_ideo_desc <- inf_stereoprob_ideo_dat %>%
  group_by(typicality) %>%
  get_summary_stats(inf, type = "mean_sd") %>%
  mutate(
    ci95_low = mean - 1.96 * sd / sqrt(n),
    ci95_upp = mean + 1.96 * sd / sqrt(n))

# Independent samples t-test
inf_stereoprob_ideo_t <- inf_stereoprob_ideo_dat %>%
  t_test(
    inf ~ typicality,
    alternative = "less",
    ref.group = "DIS") %>%
  mutate(p = formp(p, text = TRUE), df = forma(df, 2),
    statistic = forma(statistic))

# Cohens d
inf_stereoprob_ideo_d <- inf_stereoprob_ideo_dat %>%
  cohens_d(inf ~ typicality, paired = FALSE) %>%
  pull(effsize) %>%
  forma()

# Print t-test
inf_stereoprob_ideo_report <- paste0("t(", inf_stereoprob_ideo_t$df, ") = ",
  inf_stereoprob_ideo_t$statistic, ", ", inf_stereoprob_ideo_t$p, ", d = ",
  inf_stereoprob_ideo_d)

# EXCLUDE OUTLIERS
inf_stereoprob_ideo_dat_ex <- inf_stereoprob_ideo_dat %>%
  filter(inf >= 40)

# Descriptives
inf_stereoprob_ideo_ex_desc <- inf_stereoprob_ideo_dat_ex %>%
  group_by(typicality) %>%
  get_summary_stats(inf, type = "mean_sd") %>%
  mutate(
    ci95_low = mean - 1.96 * sd / sqrt(n),
    ci95_upp = mean + 1.96 * sd / sqrt(n))

# Independent samples t-test
inf_stereoprob_ideo_ex_t <- inf_stereoprob_ideo_dat_ex %>%
  t_test(
    inf ~ typicality,
    alternative = "less",
    ref.group = "DIS") %>%
  mutate(p = formp(p, text = TRUE), df = forma(df, 2),
    statistic = forma(statistic))

# Cohens d
inf_stereoprob_ideo_ex_d <- inf_stereoprob_ideo_dat_ex %>%
  cohens_d(inf ~ typicality, paired = FALSE) %>%
  pull(effsize) %>%
  forma()

# Print t-test
inf_stereoprob_ideo_ex_report <- paste0("t(", inf_stereoprob_ideo_ex_t$df, ") = ",
  inf_stereoprob_ideo_ex_t$statistic, ", ", inf_stereoprob_ideo_ex_t$p, ", d = ",
  inf_stereoprob_ideo_ex_d)

# WILCOXON
# One-sided Wilcoxon rank-sum test
inf_stereoprob_ideo_wcx <- inf_stereoprob_ideo_dat %>%
  wilcox_test(
    inf ~ typicality,
    alternative = "less",
    ref.group = "DIS")

# Wilcoxon effect size r
inf_stereoprob_ideo_wcx_r <- inf_stereoprob_ideo_dat %>%
  wilcox_effsize(inf ~ typicality,
  ref.group = "DIS") %>%
  pull(effsize)

# Print wilcoxon test
inf_stereoprob_ideo_wcx_report <- paste0("Z = ",
  forma(inf_stereoprob_ideo_wcx_r * sqrt(nrow(inf_stereoprob_ideo_dat) / 2)),
  ", ", formp(inf_stereoprob_ideo_wcx$p, TRUE),
  ", r = ", forma(inf_stereoprob_ideo_wcx_r))

To test the effect of manipulating the stereotype probability component of diagnosticity on inferences of partisanship, we conducted an exploratory independent samples t-test comparing target inferences of ideological categories in the stereotype-confirming and stereotype-disconfirming conditions. The target inferences in the disconfirming condition (M = 76.8, SD = 20.9) were not significantly lower than in the stereotype-confirming condition (M = 81.2, SD = 19.4), t(177.09) = -1.46, p = .074, d = -0.22. To investigate whether this was due to statistical outliers, we conducted another independent samples t-test excluding participants with values below 40. After exclusion, the inferences in the disconfirming condition (M = 80.5, SD = 14.6) were still not significantly lower than in the confirming condition (M = 84.0, SD = 14.6), t(168.98) = -1.57, p = .059, d = -0.24.

Outlier Detection

inf_stereoprob_ideo_dat %>%
  ggplot(., aes(typicality, inf)) +
  geom_boxplot(outlier.shape = NA) +
  geom_jitter(width = 0.2) +
  labs(x = "Typicality", y = "Inferences") +
  theme_cs_talk()

Multiverse Outlier Correction

# Loop over all combinations of cutoffs and transformations
mv_stereoprob_ideo <- data.frame(
  cutoff = c("none", "fixed 20", "fixed 30", "fixed 40",
    "Mdn ± 2.5 IQR", "Mdn ± 2.0 IQR", "Mdn ± 1.5 IQR", "Mdn ± 1.0 IQR"),
  cutoff_type = c("fixed", "fixed", "fixed", "fixed",
    "Mdn ± IQR", "Mdn ± IQR", "Mdn ± IQR", "Mdn ± IQR"),
  cutoff_value = c(0, 20, 30, 40, 2.5, 2.0, 1.5, 1.0))
for (c in seq_len(nrow(mv_stereoprob_ideo))) {
  if (mv_stereoprob_ideo$cutoff_type[c] == "fixed") {
    mv_dat <- inf_stereoprob_ideo_dat %>%
      filter(inf >= mv_stereoprob_ideo$cutoff_value[c])
  } else if (mv_stereoprob_ideo$cutoff_type[c] == "Mdn ± IQR") {
    mv_dat <- inf_stereoprob_ideo_dat %>%
      group_by(typicality) %>%
      filter(!is_outlier(inf, coef = mv_stereoprob_ideo$cutoff_value[c])) %>%
      ungroup()
  }
  # Independent samples t-test
  mv_t <- mv_dat %>%
    t_test(
      inf ~ typicality,
      alternative = "less",
      ref.group = "DIS") %>%
    mutate(p = formp(p, text = FALSE), df = forma(df, 2),
      statistic = forma(statistic))

  # Cohens d
  mv_d <- mv_dat %>%
    cohens_d(inf ~ typicality) %>%
    pull(effsize) %>%
    forma()

  # Save test statistics for h1
  mv_stereoprob_ideo$`n excluded`[c] <-
    nrow(inf_stereoprob_ideo_dat) - nrow(mv_dat)
  mv_stereoprob_ideo$df[c] <- mv_t$df
  mv_stereoprob_ideo$t[c] <- mv_t$statistic
  mv_stereoprob_ideo$p[c] <- mv_t$p
  mv_stereoprob_ideo$d[c] <- mv_d
}
# Print multiverse table
knitr::kable(select(mv_stereoprob_ideo, -cutoff_type, - cutoff_value),
  format = "markdown")
cutoff n excluded df t p d
none 0 177.09 -1.46 .074 -0.22
fixed 20 6 171.66 -1.16 .123 -0.18
fixed 30 9 168.98 -1.57 .059 -0.24
fixed 40 9 168.98 -1.57 .059 -0.24
Mdn ± 2.5 IQR 5 171.02 -0.83 .204 -0.13
Mdn ± 2.0 IQR 7 169.22 -0.93 .176 -0.14
Mdn ± 1.5 IQR 9 168.98 -1.57 .059 -0.24
Mdn ± 1.0 IQR 19 157.70 -0.67 .253 -0.10

To investigate the robustness of the effect across various outlier exclusion criteria, we conducted a multiverse analysis. We again performed independent samples t-tests across several fixed and distribution-based thresholds. The effect was not significant for all of the seven thresholds. These results suggest that manipulating the stereotype probability has no effect on inferences of partisanship.

QQ-Plot

inf_stereoprob_ideo_dat %>%
  ggplot(., aes(sample = inf)) +
  labs(x = "Theoretical quantiles", y = "Data quantiles") +
  stat_qq(color = "#000000") +
  stat_qq_line(color = "#000000") +
  facet_grid(~ typicality, labeller = "label_value") +
  theme_cs_talk()

Descriptives

knitr::kable(inf_stereoprob_ideo_desc, format = "markdown")
typicality variable n mean sd ci95_low ci95_upp
DIS inf 90 76.789 20.881 72.47494 81.10306
CON inf 90 81.167 19.433 77.15210 85.18190

Histogram

inf_stereoprob_ideo_dat %>%
  mutate(inf_bin = cut(inf,
    breaks = 9, labels = FALSE, include.lowest = TRUE)) %>%
  ggplot() +
  geom_bar(position = position_dodge(preserve = "single"),
  aes(x = inf_bin, y = after_stat(prop), fill = typicality),
    width = 0.8) +
  labs(title = "Histogramm of Inference Scores",
    x = "Inference Scores",
    y = "Proportion", fill = "Typicality") +
  scale_fill_manual(values = c("#849AB9", "#465263")) +
  theme_cs_talk() +
  theme(axis.text.x = element_blank())

Diagnosticity Simulation

diag <- data.frame(
  probsA = rep(seq(0.1, 0.9, 0.02), each = 41),
  probsB = rep(seq(0.1, 0.9, 0.02), times = 41),
  base = NA,
  incr_counter = NA,
  decr_stereo = NA
  ) %>%
  filter(probsA >= probsB)
incr <- .063

for (i in seq_len(nrow(diag))) {
  probA <- diag$probsA[i]
  probB <- diag$probsB[i]
  diag$base[i] <- probA / (probA + probB)
  diag$incr_counter[i] <- probA / (probA + (probB + incr))
  diag$decr_stereo[i] <- (probA - incr) / ((probA - incr) + probB)
}

diag_p <- diag %>%
  mutate(
    incr_counter_effect = base - incr_counter,
    decr_stereo_effect = base - decr_stereo)

library(plot3D)
par(mfrow = c(2, 1))
scatter3D(x = diag_p$probsA, y = diag_p$probsB, z = diag_p$decr_stereo_effect,
  pch = 16,
  xlab = "Stereotype Probability",
  ylab = "Counterstereotype Probability",
  zlab = "Change in Diagnosticity",
  colvar = diag_p$base,
  col = ramp.col(col = c("#2d85ff", "#28ea96"), n = 100, alpha = 1),
  main = "Change in diagnosticity due to decreasing stereotype probability")
scatter3D(x = diag_p$probsB, y = diag_p$probsA, z = diag_p$incr_counter_effect,
  pch = 16,
  xlab = "Counterstereotype Probability",
  ylab = "Stereotype Probability",
  zlab = "Change in Diagnosticity",
  colvar = diag_p$base,
  col = ramp.col(col = c("#2d85ff", "#28ea96"), n = 100, alpha = 1),
  main = "Change in diagnosticity due to increasing counterstereotype probability")

diag_dat <- dat %>%
  filter(item_type == "target") %>%
  filter(inf >= 40)

# Export data for simulation
# saveRDS(diag_dat, "Preregistration/sim_dat.RDS")

Decreasing the stereotype probability leads to larger decreases of diagnosticity the smaller the stereotype probability and the closer the two probabilities are together. Generally, these are cases with low diagnosticity. Increasing the counterstereotype probability the other hand leads to larger decreases of diagnosticity the smaller the counterstereotype probability and the further the two probabilities are apart. Generally these are cases with high diagnosticity. As the opinions presented in the current study are highly diagnostic, it would be expected on account of the diagnosticity formula, that decreasing the stereotype probability produces smaller decrease in diagnosticity compared to increasing the counterstereotype probability.

Likability

Category Fit * Typicality

# Stereotype data
like_dat <- dat %>%
  select(subject_id, target_category_label, target_category,
    partisan_identity, political_ideology,
    category_type, typicality, issue, matches("_like_")) %>%
  unique() %>%
  # Exclude participants who gave same rating in all likability ratings
  rowwise() %>%
  filter(
    !all(
      t1_like_nontarget == t1_like_target,
      t1_like_target == t2_like_nontarget,
      t2_like_nontarget == t2_like_target)) %>%
  ungroup() %>%
  pivot_longer(
    cols = matches("_like_"),
    names_to = c("time", ".value", "person"),
    names_pattern = "([a-z0-9]*)_(like)_(.*)") %>%
  mutate(participant_category = case_when(.default = "OTH",
    category_type == "PARTY" &
      partisan_identity == "Independent" ~ "IND",
    category_type == "PARTY" &
      partisan_identity == "Republican" ~ "REP",
    category_type == "PARTY" &
      partisan_identity == "Democrat" ~ "DEM",
    category_type == "IDEOLOGICAL" &
      (political_ideology <= 65 & political_ideology >= 35) ~ "MOD",
    category_type == "IDEOLOGICAL" &
      (political_ideology > 65) ~ "LIB",
    category_type == "IDEOLOGICAL" &
      (political_ideology < 35) ~ "CON")) %>%
  filter(!participant_category %in% c("MOD", "IND", "OTH")) %>%
  mutate(category_fit = as.factor(ifelse(
    participant_category == target_category_label,
    "ingroup", "outgroup"))) %>%
  filter(person == "target")

# Descriptives
like_desc <- like_dat %>%
  group_by(category_fit, typicality, time) %>%
  get_summary_stats(like, type = "mean_sd") %>%
  mutate(
    ci95_low = mean - 1.96 * sd / sqrt(n),
    ci95_upp = mean + 1.96 * sd / sqrt(n))

# Run ANOVA
like_mod <- like_dat %>%
  anova_test(dv = like,
    wid = subject_id,
    effect.size = "pes",
    within = time,
    between = c(category_fit, typicality)) %>%
  as_tibble() %>%
  rowwise() %>%
  mutate(F = forma(`F`, 2), p = formp(p), pes = forma(pes, 3, FALSE))

Outlier Detection

like_dat %>%
  ggplot(., aes(typicality, like, color = time)) +
  facet_wrap(~ category_fit) +
  geom_boxplot(outlier.shape = NA) +
  geom_point(position = position_jitterdodge()) +
  labs(x = "Typicality", y = "Stereotype") +
  scale_color_manual(values = c("#849AB9", "#465263")) +
  theme_cs_talk()

QQ-Plot

like_dat %>%
  ggplot(., aes(sample = like)) +
  labs(x = "Theoretical quantiles", y = "Data quantiles") +
  stat_qq(color = "#000000") +
  stat_qq_line(color = "#000000") +
  facet_grid(category_fit * typicality ~ time, labeller = "label_value") +
  theme_cs_talk()

Descriptives

knitr::kable(like_desc, format = "markdown")
typicality time category_fit variable n mean sd ci95_low ci95_upp
DIS t1 ingroup like 61 77.951 16.842 73.72446 82.17754
DIS t2 ingroup like 61 68.148 25.608 61.72161 74.57439
CON t1 ingroup like 67 78.030 18.292 73.64994 82.41006
CON t2 ingroup like 67 81.015 18.079 76.68595 85.34405
DIS t1 outgroup like 56 62.321 29.248 54.66048 69.98152
DIS t2 outgroup like 56 69.304 24.596 62.86191 75.74609
CON t1 outgroup like 55 65.418 23.418 59.22894 71.60706
CON t2 outgroup like 55 49.964 26.728 42.90015 57.02785

ANOVA

knitr::kable(like_mod, format = "markdown")
Effect DFn DFd F p p<.05 pes
category_fit 1 235 31.32 <.001 * .118
typicality 1 235 0.10 .751 .000
time 1 235 6.76 .010 * .028
category_fit:typicality 1 235 7.90 .005 * .033
category_fit:time 1 235 0.08 .779 .000
typicality:time 1 235 2.69 .102 .011
category_fit:typicality:time 1 235 35.89 <.001 * .132

Histogram

like_dat %>%
  mutate(like_bin = cut(like,
    breaks = 9, labels = FALSE, include.lowest = TRUE)) %>%
  ggplot() +
  geom_bar(position = position_dodge(preserve = "single"),
  aes(x = like_bin, y = after_stat(prop), fill = time), width = 0.8) +
  labs(title = "Histogramm of Stereotype Scores",
    x = "Likability (binned)",
    y = "Proportion", fill = "Time") +
  facet_grid(category_fit ~ typicality, labeller = "label_value") +
  scale_fill_manual(values = c("#849AB9", "#465263")) +
  theme_cs_talk() +
  theme(axis.text.x = element_blank())

LS0tCnRpdGxlOiAiQW5hbHlzZXMgZm9yIERJQUctTm9uUGFydHktUmFkaW8iCm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazoKICBjb2RlX2ZvbGRpbmc6IGhpZGUKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZSA9IEZBTFNFfQojIFIgdmVyc2lvbiA0LjIuMwojIGxvYWQgcGFja2FnZXMgJiBzZXQgb3B0aW9ucwpsaWJyYXJ5KGRwbHlyKSAjIGRwbHlyXzEuMS4yCmxpYnJhcnkoZ2dwbG90MikgIyBnZ3Bsb3QyXzMuNC4yCmxpYnJhcnkoZ2dwdWJyKSAjIGdncHVicl8wLjYuMApsaWJyYXJ5KGdncmVwZWwsIGluY2x1ZGUub25seSA9ICJnZW9tX2xhYmVsX3JlcGVsIikgIyBnZ3JlcGVsXzAuOS4zCmxpYnJhcnkoaGVyZSkgIyBoZXJlXzEuMC4xCmxpYnJhcnkobG1lclRlc3QpICMgbG1lclRlc3RfMy4xLTMKbGlicmFyeShtYWdyaXR0ciwgaW5jbHVkZS5vbmx5ID0gIiVUPiUiKSAjIG1hZ3JpdHRyXzIuMC4zCmxpYnJhcnkocnN0YXRpeCkgIyByc3RhdGl4XzAuNy4yCmxpYnJhcnkoc2hvd3RleHQpICMgc2hvd3RleHRfMC45LTYKbGlicmFyeSh0aWR5dmVyc2UpICMgdGlkeXZlcnNlXzIuMC4wCgojIFJlYWQgZGF0YQpkYXQgPC0gcmVhZFJEUyhoZXJlOjpoZXJlKCJQcm9jZXNzZWQgZGF0YS9wcm9jZXNzZWQtZGF0YS5yZHMiKSkKCiMgRGVtb2dyYXBoaWNzCmRlbXMgPC0gZGF0ICU+JQogIHNlbGVjdChzdWJqZWN0X2lkLCBhZ2UsIHByb19hZ2UsIGdlbmRlciwgcHJvX2dlbmRlciwKICAgIHByb19yYWNpYWxfZ3JvdXAsIHBhcnRpc2FuX2lkZW50aXR5LCBwcm9fcGFydGlzYW5faWRlbnRpdHksCiAgICBwb2xpdGljYWxfaWRlb2xvZ3ksIHRpbWVfdGFrZW4sIHRpbWVfb25fZGF0YV9zZWN1cml0eSwKICAgIHN0YW5kX291dCwgZGVjZXB0aW9uLCBkZWNlcHRpb25fY29kZWQsIGZ1cnRoZXJfY29tbWVudHMpICU+JQogIHVuaXF1ZSgpCgojIENvbXBhcmUgcXVhbHRyaWNzIGFuZCBwcm9saWZpYyBkZW1vZ3JhcGhpY3MKZGVtc19tYXRjaCA8LSBkZW1zICU+JQogIG11dGF0ZSgKICAgIHByb19nZW5kZXIgPSBjYXNlX21hdGNoKHByb19nZW5kZXIsCiAgICAgIGMoIkZlbWFsZSIpIH4gIndvbWFuIiwKICAgICAgYygiTWFsZSIpIH4gIm1hbiIpKSAlPiUKICBtdXRhdGUocGFydGlzYW5fY2hhbmdlID0gaWZlbHNlKAogICAgYXMuY2hhcmFjdGVyKHBhcnRpc2FuX2lkZW50aXR5KSAhPSBhcy5jaGFyYWN0ZXIocHJvX3BhcnRpc2FuX2lkZW50aXR5KSwKICAgIHBhc3RlKHByb19wYXJ0aXNhbl9pZGVudGl0eSwgcGFydGlzYW5faWRlbnRpdHksIHNlcCA9ICIgLT4gIiksIE5BKSkgJT4lCiAgbXV0YXRlKAogICAgYWdlX21hdGNoID0gYWdlID09IHByb19hZ2UsCiAgICBnZW5kZXJfbWF0Y2ggPSBhcy5jaGFyYWN0ZXIoZ2VuZGVyKSA9PSBhcy5jaGFyYWN0ZXIocHJvX2dlbmRlciksCiAgICBwYXJfaWRfbWF0Y2ggPSBhcy5jaGFyYWN0ZXIocGFydGlzYW5faWRlbnRpdHkpID09IGFzLmNoYXJhY3Rlcihwcm9fcGFydGlzYW5faWRlbnRpdHkpICMgbm9saW50CiAgKSAlPiUKICBzZWxlY3Qoc3ViamVjdF9pZCwgYWdlX21hdGNoLCBnZW5kZXJfbWF0Y2gsIHBhcl9pZF9tYXRjaCwgcGFydGlzYW5fY2hhbmdlKQoKIyBzdW1tYXJpc2UoZGVtc19tYXRjaCwgYWNyb3NzKG1hdGNoZXMoIl9tYXRjaCIpLCB+c3VtKC4pKSkgLyAzNjAKIyB0YWJsZShkZW1zX21hdGNoJHBhcnRpc2FuX2NoYW5nZSkKCiMgQWRkIGN1c3RvbSBmb250IGZvciBwbG90cwpmb250X2FkZCgiTnVuaXRvIiwKICByZWd1bGFyID0gIi9Vc2Vycy9jYXJzdGVuL0xpYnJhcnkvRm9udHMvTnVuaXRvU2Fucy1SZWd1bGFyLnR0ZiIsCiAgaXRhbGljID0gIi9Vc2Vycy9jYXJzdGVuL0xpYnJhcnkvRm9udHMvTnVuaXRvU2Fucy1JdGFsaWMudHRmIiwKICBib2xkID0gIi9Vc2Vycy9jYXJzdGVuL0xpYnJhcnkvRm9udHMvTnVuaXRvU2Fucy1Cb2xkLnR0ZiIsCiAgYm9sZGl0YWxpYyA9ICIvVXNlcnMvY2Fyc3Rlbi9MaWJyYXJ5L0ZvbnRzL051bml0b1NhbnMtQm9sZEl0YWxpYy50dGYiKQpzaG93dGV4dF9hdXRvKCkKCiMgQ3VzdG9tIGZ1bmN0aW9ucwpmb3JtcCA8LSBmdW5jdGlvbihwLCB0ZXh0ID0gRkFMU0UpIHsKICAjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAjIyBGb3JtYXQgcCB2YWx1ZXMKICAjIwogICMjIFRoaXMgZnVuY3Rpb24gdGFrZXMgaW4gYSBudW1iZXIgYmV0d2VlbgogICMjIHplcm8gYW5kIG9uZSBvciBhIGZvcm1hdHRlZCBwLXZhbHVlIGFuZCBvdXRwdXRzCiAgIyMgYSBmb3JtYXR0ZWQgcC12YWx1ZS4gSWYgcC12YWx1ZSBpcyBhbHJlYWR5IGZvcm1hdHRlZAogICMjIHRoZW4gYXBwbHlpbmcgdGhlIGZ1bmN0aW9uIGNoYW5nZXMgdGhlIGZvcm1hdCBmcm9tCiAgIyMgInAgPSAuMDM0IiB0byAiLjAzNCIgYW5kIHZpY2UgdmVyc2EuCiAgIyMKICAjIyBAcCBwLXZhbHVlIHRvIGJlIGZvcm1hdHRlZAogICMjIEB0ZXh0IGFkZHMgInAgPSAiIG9yICJwIDwgIiB0byBvdXRwdXQKICAjIwogICMjIEBvdXQgc3RyaW5nIHdpdGggZm9ybWF0dGVkIHAtdmFsdWUKICAjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgIyBJZiBhbHJlYWR5IGZvcm1hdHRlZCBidXQgbm8gInAiIHRoZW4gYWRkICJwIgogIGlmIChncmVwbCgiXjwuXFxkezN9JCIsIHApKSB7CiAgb3V0IDwtIGdzdWIoIjwiLCAicCA8ICIsIHApCiAgfSBlbHNlIGlmIChncmVwbCgiXi5cXGR7M30kIiwgcCkpIHsKICBvdXQgPC0gZ3N1YigiXiIsICJwID0gIiwgcCkKICAjIElmIGFscmVhZHkgZm9ybWF0dGVkIGFuZCAicCIgdGhlbiByZW1vdmUgInAiCiAgfSBlbHNlIGlmIChncmVwbCgiXnAgPCAuXFxkezN9JCIsIHApKSB7CiAgb3V0IDwtIGdzdWIoInAgPCAiLCAiPCIsIHApCiAgfSBlbHNlIGlmIChncmVwbCgiXnAgPSAuXFxkezN9JCIsIHApKSB7CiAgb3V0IDwtIGdzdWIoInAgPSAiLCAiIiwgcCkKICAjIElmIG5vdCB5ZXQgZm9ybWF0dGVkIGFuZCBzbWFsbGVyIHRoYW4gLjAwMQogIH0gZWxzZSBpZiAoaXMubnVtZXJpYyhwKSAmJiBwIDwgMC4wMDEpIHsKICBpZiAodGV4dCkgewogICAgb3V0IDwtICJwIDwgLjAwMSIKICB9IGVsc2UgewogICAgb3V0IDwtICI8LjAwMSIKICB9CiAgIyBJZiBub3QgeWV0IGZvcm1hdHRlZCBhbmQgYmlnZ2VyIHRoYW4gLjAwMQogIH0gZWxzZSBpZiAocCA+PSAwLjAwMSkgewogIHAgPC0gZm9ybWF0KHJvdW5kKHAsIDMpLCBuc21hbGwgPSAzLCBzY2llbnRpZmljID0gRkFMU0UpCiAgcCA8LSBzdWIoIjAuIiwgIi4iLCBwKQogIGlmICh0ZXh0KSB7CiAgICBvdXQgPC0gcGFzdGUoInAgPSIsIHApCiAgfSBlbHNlIHsKICAgIG91dCA8LSBwCiAgfQogIH0KICByZXR1cm4ob3V0KQp9CmZvcm1hIDwtIGZ1bmN0aW9uKG51bWJlciwgZGVjID0gTlVMTCwgbGVhZF96ZXJvID0gVFJVRSkgeyAjIG5vbGludAogICMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICMjIEZvcm1hdCB2YWx1ZXMgaW4gYXBhIHN0eWxlCiAgIyMKICAjIyBUaGlzIGZ1bmN0aW9uIHRha2VzIGluIGEgbnVtYmVyIGFuZCBvdXRwdXRzCiAgIyMgYSBmb3JtYXR0ZWQgbnVtYmVyLiBJZiBubyBkZWNpbWFsIGlzIHByb3ZpZGVkLCB0aGVuCiAgIyMgaXQgdXNlcyBhIGhldXJpc3RpYyB0byByb3VuZCB0aGUgbnVtYmVyLiBJZiBsZWFkX3plcm8KICAjIyBpcyBzZXQgdG8gRkFMU0UsIHRoZW4gdGhlIGxlYWQgemVybyBvZiB0aGUgbnVtYmVyIGlzCiAgIyMgcmVtb3ZlZCAodXNlZnVsIGZvciBwLXZhbHVlcyBvciBldGEgc3F1YXJlZCkuCiAgIyMKICAjIyBAbnVtYmVyIGlucHV0IG51bWJlcgogICMjIEBkZWMgb3B0aW9uYWwgbnVtYmVyIG9mIGRlY2ltYWxzCiAgIyMgQGxlYWRfemVybyBrZWVwIGxlYWRpbmcgemVybwogICMjCiAgIyMgQG91dCBmb3JtYXR0ZWQgbnVtYmVyCiAgIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICMgSWYgZGVjIGlzIGxvZ2ljYWwsIGludGVycHJldCBhcyBsZWFkX3plcm8KICBpZiAoaXMubG9naWNhbChkZWMpKSB7CiAgbGVhZF96ZXJvIDwtIGRlYwogIGRlYyA8LSBOVUxMCiAgfQogICMgSWYgbm8gZGVjaW1hbCBpcyBzcGVjaWZpZWQsIHVzZSBoZXVyaXN0aWMKICBpZiAoIWlzLm51bGwoZGVjKSkgewogIH0gZWxzZSBpZiAoYWJzKG51bWJlcikgPj0gMTAwKSB7CiAgICBkZWMgPC0gMAogIH0gZWxzZSBpZiAoYWJzKG51bWJlcikgPj0gMTAgJiYgbnVtYmVyIDwgMTAwKSB7CiAgICBkZWMgPC0gMQogIH0gZWxzZSBpZiAoYWJzKG51bWJlcikgPj0gMC4xICYmIG51bWJlciA8IDEwKSB7CiAgICBkZWMgPC0gMgogIH0gZWxzZSBpZiAoYWJzKG51bWJlcikgPj0gMC4wMDEgJiYgbnVtYmVyIDwgMC4xKSB7CiAgICBkZWMgPC0gMwogIH0gZWxzZSBpZiAoYWJzKG51bWJlcikgPCAwLjAwMSAmJiBudW1iZXIgIT0gMCkgewogICAgZGVjIDwtIHN0cmluZ3I6OnN0cl9sb2NhdGUoZm9ybWF0KAogICAgICBhYnMobnVtYmVyKSwgc2NpZW50aWZpYyA9IEZBTFNFKSwgIlsxLTldezF9IilbMV0gLSAyCiAgfSBlbHNlIGlmIChudW1iZXIgPT0gMCkgewogICAgZGVjIDwtIDAKICB9CiAgIyBSb3VuZCBudW1iZXIgdG8gZGVjaW1hbAogIG91dCA8LSBmb3JtYXQocm91bmQobnVtYmVyLCBkZWMpLCBuc21hbGwgPSBkZWMsIHNjaWVudGlmaWMgPSBGQUxTRSkKICAjIFJlbW92ZSBsZWFkaW5nIHplcm8gaWYgcmVxdWlyZWQKICBpZiAob3V0IDwgMSAmJiBsZWFkX3plcm8gPT0gRkFMU0UpIHsKICBvdXQgPC0gc3ViKCIwLiIsICIuIiwgb3V0KQogIH0KICByZXR1cm4ob3V0KQp9CnJlcG9ydF9kZXNjIDwtIGZ1bmN0aW9uKGRlc2NyaXB0aXZlcywgbGluZSkgewogICMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICMjIFJlcG9ydCBkZXNjcmlwdGl2ZSBzdGF0aXN0aWNzCiAgIyMKICAjIyBUYWtlcyBhIGRhdGEuZnJhbWUgY29udGFpbmluZyBkZXNjcmlwdGl2ZQogICMjIHJlc3VsdHMgYW5kIG91dHB1dHMgYSBtYW51c2NyaXB0LXJlYWR5IHN0cmluZwogICMjIGNvbnRhaW5pbmcgdGhlIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbgogICMjIGUuZy4sICIoTSA9IDQuNDUsIFNEID0gMS4yOSkiCiAgIyMKICAjIyBAcGFyYW0gZGVzY3JpcHRpdmVzIC0tIGRhdGEuZnJhbWUgd2l0aAogICMjICAgICAgICBkZXNjcmlwdGl2ZSBkYXRhCiAgIyMgQHBhcmFtIGxpbmUgLS0gbGluZSBvZiBkZXNjcmlwdGl2ZXMgZGF0YQogICMjICAgICAgICB0byByZXBvcnQKICAjIwogICMjIEByZXR1cm4gc3RyaW5nIHN0cmluZyBjb250YWluaW5nIE0gYW5kIFNECiAgIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgb3V0IDwtIHBhc3RlMCgKICAgICIoTSA9ICIsCiAgICBmb3JtYShkZXNjcmlwdGl2ZXMkbWVhbltsaW5lXSksCiAgICAiLCBTRCA9ICIsCiAgICBmb3JtYShkZXNjcmlwdGl2ZXMkc2RbbGluZV0pLAogICAgIikiKQogIHJldHVybihvdXQpCn0KY29yX3RhYmxlIDwtIGZ1bmN0aW9uKGRhdGEsIG1ldGhvZCA9IGMoInBlYXJzb24iLCAic3BlYXJtYW4iKSkgewogICMgQ29tcHV0ZSBjb3JyZWxhdGlvbiBtYXRyaXgKICBwdmFsdWVzIDwtIGRhdGEgJT4lCiAgY29yX3BtYXQobWV0aG9kID0gbWV0aG9kWzFdKSAlPiUKICByb3d3aXNlKCkgJT4lCiAgbXV0YXRlKGFjcm9zcyghMSwgZm9ybXApKQogIGNvZWZzIDwtIGRhdGEgJT4lCiAgY29yX21hdChtZXRob2QgPSBtZXRob2RbMV0pICU+JQogIHJvd3dpc2UoKSAlPiUKICBtdXRhdGUoYWNyb3NzKCExLCBmb3JtYSwgMikpCiAgZm9yIChyb3cgaW4gc2VxKDIsIG5yb3coY29lZnMpKSkgewogIGZvciAoY29sIGluIHNlcSgyLCBuY29sKGNvZWZzKSAtIDEpKSB7CiAgICBjIDwtIGNvZWZzW3JvdywgY29sXQogICAgcCA8LSBwdmFsdWVzW3JvdywgY29sXQogICAgY29lZnNbcm93LCBjb2xdIDwtIHBhc3RlMChjLCAiICgiLCBwLCAiKSIpCiAgfQogIH0KICBjb2VmcyA8LSBjb2VmcyAlPiUKICBwdWxsX2xvd2VyX3RyaWFuZ2xlKCkgJT4lCiAgc2xpY2UoLTEpICU+JQogIHNlbGVjdCgtbGFzdF9jb2woKSkgJT4lCiAgcmVuYW1lKHZhcmlhYmxlID0gMSkKICByZXR1cm4oY29lZnMpCn0KdGhlbWVfY3NfdGFsayA8LSBmdW5jdGlvbihmb250ID0gIk51bml0byIsIGxhYl9zaXplID0gMTYsIGxhYmVsX3NpemUgPSAxNCwKICBkYXJrID0gIiM0NjUyNjMiLCBsaWdodCA9ICIjRTFFOUVEIiwgc29saWRfZmFjZXQgPSBUUlVFKSB7CiAgaWYgKHNvbGlkX2ZhY2V0KSB7CiAgZmFjZXRfZmlsbCA8LSBkYXJrCiAgZmFjZXRfdGV4dCA8LSBsaWdodAogIH0gZWxzZSBpZiAoIXNvbGlkX2ZhY2V0KSB7CiAgZmFjZXRfZmlsbCA8LSAidHJhbnNwYXJlbnQiCiAgZmFjZXRfdGV4dCA8LSBkYXJrCiAgfQogIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE2KSAlK3JlcGxhY2UlCiAgdGhlbWUoCiAgIyBSZWN0YW5nbGUgZWxlbWVudHMKICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsCiAgICBjb2xvciA9IE5BX2NoYXJhY3Rlcl8pLAogIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIpLAogIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvciA9IE5BKSwKICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yID0gZmFjZXRfZmlsbCwKICAgIGZpbGwgPSBmYWNldF9maWxsLCBsaW5ld2lkdGggPSAxKSwKICAjIFRleHQgZWxlbWVudHMKICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnQsIHNpemUgPSBsYWJfc2l6ZSwKICAgIGZhY2UgPSAiYm9sZCIsIGhqdXN0ID0gMCwgdmp1c3QgPSAyLCBjb2xvciA9IGRhcmspLAogIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gZm9udCwKICAgIHNpemUgPSBsYWJfc2l6ZSAtIDIsIGNvbG9yID0gZGFyayksCiAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnQsIHNpemUgPSBsYWJfc2l6ZSwKICAgIGhqdXN0ID0gMSwgY29sb3IgPSBkYXJrKSwKICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnQsIHNpemUgPSBsYWJfc2l6ZSwKICAgIGNvbG9yID0gZGFyayksCiAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnQsIHNpemUgPSBsYWJlbF9zaXplLAogICAgY29sb3IgPSBkYXJrKSwKICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChtYXJnaW4gPSBtYXJnaW4oNSwgYiA9IDEwKSwKICAgIGNvbG9yID0gZGFyayksCiAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IGZvbnQsIHNpemUgPSBsYWJfc2l6ZSwKICAgIGNvbG9yID0gZGFyaywgaGp1c3QgPSAwKSwKICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250LCBzaXplID0gbGFiZWxfc2l6ZSwKICAgIGNvbG9yID0gZGFyayksCiAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBmb250LCBzaXplID0gbGFiZWxfc2l6ZSwKICAgIGNvbG9yID0gZmFjZXRfdGV4dCwgbWFyZ2luID0gbWFyZ2luKDQsIDQsIDQsIDQpKSwKICAjIExpbmUgZWxlbWVudHMKICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG9yID0gZGFyaywgbGluZXdpZHRoID0gMC41KSwKICBsZWdlbmQua2V5ID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvciA9IE5BX2NoYXJhY3Rlcl8pLAogIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksCiAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwKICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3IgPSBkYXJrLCBmaWxsID0gTkEsIGxpbmV3aWR0aCA9IDEpCiAgKQp9CmBgYAoKIyMgU2FtcGxlIENoYXJhY3RlcmlzdGljcwpXZSBjb2xsZWN0ZWQgZGF0YSBmcm9tIGEgdG90YWwgb2YgTiA9IDM4OSBwYXJ0aWNpcGFudHMgdXNpbmcgYSBQcm9saWZpYyByZXByZXNlbnRhdGl2ZSBzYW1wbGUgdGhhdCB3YXMgc3RyYXRpZmllZCBvbiB0aGUgYmFzaXMgb2YgYWdlLCBzZXgsIGV0aG5pY2l0eSwgYW5kIHBvbGl0aWNhbCBhZmZpbGlhdGlvbi4gRm9sbG93aW5nIG91ciBleGNsdXNpb24gY3JpdGVyaWEgd2UgaGFkIHRvIGV4Y2x1ZGUgMjggcGFydGljaXBhbnRzIHdobyBpbmZlcnJlZCB0aGUgd3JvbmcgY2F0ZWdvcnkgaW4gZml2ZSBvciBtb3JlIG5vbi10YXJnZXQgaW5mZXJlbmNlIGl0ZW1zIGFuZCBvbmUgcGFydGljaXBhbnQgd2hvIHJhdGVkIHRoZWlyIG93biBkYXRhIHRvIGJlIHVuZml0IGZvciBhbmFseXNpcy4gVGhpcyByZXN1bHRlZCBpbiBOID0gMzYwIHZhbGlkIGRhdGFzZXRzICgxNzUgbWVuLCAxODAgd29tZW4sIDQgbm9uLWJpbmFyeSwgMSBuL2E7IG1lZGlhbiBhZ2UgTWRuID0gYHIgcm91bmQobWVkaWFuKGRlbXMkYWdlLCBuYS5ybSA9IFRSVUUpLCAxKWAgeWVhcnMsIHJhbmdpbmcgZnJvbSBgciBtaW4oZGVtcyRhZ2UsIG5hLnJtID0gVFJVRSlgIHRvIGByIG1heChkZW1zJGFnZSwgbmEucm0gPSBUUlVFKWApLiA0MiUgb2YgcGFydGljaXBhbnRzIGlkZW50aWZpZWQgYXMgRGVtb2NyYXRzLCAyMyUgYXMgSW5kZXBlbmRlbnRzLCAzMyUgYXMgUmVwdWJsaWNhbnMsIGFuZCAyJSBhcyBvdGhlci4gQWNjb3JkaW5nIHRvIFByb2xpZmljIGRlbW9ncmFwaGljcywgbW9yZSBwYXJ0aWNpcGFudHMgaWRlbnRpZmllZCBhcyBJbmRlcGVuZGVudHMgKDMxJSBEZW1vY3JhdHMsIDQyJSBJbmRlcGVuZGVudHMsIDI3JSBSZXB1YmxpY2FucynigJNwb3NzaWJseSBiZWNhdXNlIHRoZXJlIHdhcyBubyAiSW5kZXBlbmRlbnQiIG9wdGlvbiBpbiBvdXIgc3VydmV5LiBQYXJ0aWNpcGFudHMgcmVjZWl2ZWQgbW9uZXRhcnkgY29tcGVuc2F0aW9uIG9mIDEuMjAgR0JQIGZvciBjb21wbGV0aW5nIHRoZSA4LW1pbnV0ZSBzdHVkeS4gUGFydGljaXBhbnRzJyBtZWFuIHBvbGl0aWNhbCBpZGVvbG9neSB3YXMgTSA9IGByIHJvdW5kKG1lYW4oZGVtcyRwb2xpdGljYWxfaWRlb2xvZ3ksIG5hLnJtID0gVFJVRSksIDEpYCAoU0QgPSBgciByb3VuZChzZChkZW1zJHBvbGl0aWNhbF9pZGVvbG9neSwgbmEucm0gPSBUUlVFKSwgMSlgKSwgb24gYSBzY2FsZSBmcm9tIDAgPSBjb25zZXJ2YXRpdmUgdG8gMTAwID0gbGliZXJhbC4gODAgYWRkaXRpb25hbCBwZW9wbGUgc3RhcnRlZCB0aGUgZXhwZXJpbWVudCBvbiBwcm9saWZpYyBidXQgcmV0dXJuZWQgdGhlaXIgc3VibWlzc2lvbiwgdGltZWQtb3V0LCBkaWQgbm90IG1lZXQgdGhlIGluY2x1c2lvbiBjcml0ZXJpYSwgb3IgZmFpbGVkIHRoZSBjb21wcmVoZW5zaW9uIGNoZWNrLgoKIyMgRXhjbHVzaW9uIG9mIFN0YXRpc3RpY2FsIE91dGxpZXJzCldlIGRpZCBub3QgcHJlcmVnaXN0ZXIgZXhjbHVzaW9uIG9mIHN0YXRpc3RpY2FsIG91dGxpZXJzLiBIb3dldmVyLCB1cG9uIGluc3BlY3Rpb24gb2YgdGhlIGRhdGEgd2Ugbm90aWNlZCB0aGF0IHRoZXJlIHdlcmUgbWFueSBkYXRhIHBvaW50cyB0aGF0IHdlcmUgdmVyeSB1bmxpa2VseSB0byByZWZsZWN0IHRydWUgaW5mZXJlbmNlcy4gVGhhdCBpcywgc29tZSBwYXJ0aWNpcGFudHMgaW4gYm90aCB0aGUgc3RlcmVvdHlwZS1kaXNjb25maXJtaW5nIGFuZCB0aGUgc3RlcmVvdHlwZS1jb25maXJtaW5nIGNvbmRpdGlvbiBzZWVtZWQgdG8gaW5mZXIgY2F0ZWdvcmllcyBmcm9tIG9waW5pb25zIHRoYXQgYXJlIHN0ZXJlb3R5cGljYWxseSBhc3NvY2lhdGVkIHdpdGggdGhlIG9wcG9zaW5nIGNhdGVnb3J5IChlLmcuLCBpbmZlcnJpbmcgZnJvbSBhIHByby1ndW4gY29udHJvbCBvcGluaW9uIHRoYXQgdGhlIHBlcnNvbiBtdXN0IGJlIGEgUmVwdWJsaWNhbikuIFdlIGFzc3VtZSB0aGF0IHN1Y2ggcmVzcG9uc2VzIGFyZSBsaWtlbHkgZHVlIHRvIHRoZSBwYXJ0aWNpcGFudHMgdW5kZXJzdGFuZGluZyB0aGUgaXRlbXMgdGhlIHdyb25nIHdheSBhcm91bmQgb3IgcmVzcG9uZGluZyBhdCByYW5kb20uIFRvIGludmVzdGlnYXRlIHRoZSBwb3RlbnRpYWwgZWZmZWN0IG9mIHRoZXNlIG91dGxpZXJzIHdlIGNvbmR1Y3RlZCBhZGRpdGlvbmFsIGFuYWx5c2VzIGV4Y2x1ZGluZyB0aGVtLiBUaGVvcmV0aWNhbGx5LCBhbnkgdmFsdWVzIGJlbG93IHRoZSBzY2FsZSBtaWRwb2ludCAoNTApIGFyZSB2ZXJ5IHVubGlrZWx5IHRvIHJlZmxlY3QgZ2VudWluZSBpbmZlcmVuY2VzLCBiZWNhdXNlIHRoZXkgd291bGQgaW5kaWNhdGUgdGhhdCB0aGUgY2F0ZWdvcnkgdGhhdCBpcyBub3Qgc3RlcmVvdHlwaWNhbGx5IGFzc29jaWF0ZWQgd2l0aCB0aGUgb3BpbmlvbiBpcyBtb3JlIGxpa2VseSB0byBleHByZXNzIHRoZSBvcGluaW9uIHRoYW4gdGhlIGNhdGVnb3J5IHRoYXQgaXMgc3RlcmVvdHlwaWNhbGx5IGFzc29jaWF0ZWQgd2l0aCBpdC4gV2hpbGUgaXQgd291bGQgdGhlcmVmb3JlIHNlZW0gYXBwcm9wcmlhdGUgdG8gZXhjbHVkZSBhbnkgdmFsdWVzIGJlbG93IDUwLCB3ZSBkZWNpZGVkIHRvIGV4Y2x1ZGUgdmFsdWVzIGJlbG93IDQwLCB0byBhY2NvdW50IGZvciB0aGUgZmFjdCB0aGF0IHBhcnRpY2lwYW50cyBtYXkgcmVzcG9uZCBzb21ld2hhdCBpbmFjY3VyYXRlbHkgdXNpbmcgdGhlIHNsaWRpbmcgc2NhbGUuIEZvciB0aGUgbWFpbiBhbmFseXNlcyB3ZSByZXBvcnQgdGVzdHMgd2l0aCBhbmQgd2l0aG91dCB0aGlzIGV4Y2x1c2lvbiBjcml0ZXJpb24uCgpBIHNpbWlsYXIgcHJvYmxlbSBvY2N1cnJlZCBmb3IgdGhlIHN0ZXJlb3R5cGUgbWVhc3VyZSBvbiB3aGljaCBzb21lIHBhcnRpY2lwYW50IGluZGljYXRlZCB0aGF0IGNhdGVnb3J5IG1lbWJlcnMgd291bGQgb24gYXZlcmFnZSBzdHJvbmdseSBkaXNhZ3JlZSB3aXRoIG9waW5pb25zIHRoYXQgYXJlIHN0ZXJlb3R5cGljYWwgZm9yIHRoZWlyIGNhdGVnb3J5LiBIb3dldmVyLCBmb3IgdGhpcyBtZWFzdXJlIHRoZXJlIGlzIGxlc3Mgb2YgYSBjbGVhciBjdXRvZmYsIGJlY2F1c2UgZXZlbiBhbiBvcGluaW9uIHRoYXQgaXMgdmVyeSBzdGVyZW90eXBpY2FsIG9yIGRpYWdub3N0aWMgZm9yIGEgY2F0ZWdvcnkgbXVzdCBub3QgYmUgc2hhcmVkIGJ5IGEgbWFqb3JpdHkgb2YgaXRzIG1lbWJlcnMgKGFzIGxvbmcgYXMgaXQgaXMgc2hhcmVkIGJ5IGNvbnNpZGVyYWJseSBsZXNzIG1lbWJlcnMgb2YgdGhlIG9wcG9zaW5nIGNhdGVnb3J5KS4gVG8gbmV2ZXJ0aGVsZXNzIGludmVzdGlnYXRlIHRoZSBlZmZlY3Qgb2YgdGhlc2Ugb3V0bGllcnMgd2UgY29uZHVjdGVkIGEgbXVsdGl2ZXJzZSBhbmFseXNpcyB1c2luZyBzZXZlcmFsIGRpZmZlcmVudCBjdXRvZmYgY3JpdGVyaWEuCgojIyBNYW5pcHVsYXRpb24gQ2hlY2sKIyMjIFN0ZXJlb3R5cGUgfiBUeXBpY2FsaXR5ICogQ2F0ZWdvcnkgVHlwZSB7LnRhYnNldH0KYGBge3Igc3RlcmVvdHlwZSB+IHR5cGljYWxpdHkgKiBjYXRlZ29yeV90eXBlLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0KIyBTdGVyZW90eXBlIGRhdGEKc3RlcmVvX2RhdCA8LSBkYXQgJT4lCiAgZmlsdGVyKGl0ZW1fdHlwZSA9PSAidGFyZ2V0IikgJT4lCiAgZmlsdGVyKGRpYWdub3N0aWNpdHlfY29tcG9uZW50ID09ICJDT1VOVEVSUFJPQiIpCmBgYAoKIyMjIyBPdXRsaWVyIERldGVjdGlvbgpgYGB7ciBzdGVyZW90eXBlIH4gdHlwaWNhbGl0eSAqIGNhdGVnb3J5X3R5cGUgb3V0bGllciwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9CnN0ZXJlb19kYXQgJT4lCiAgZ2dwbG90KC4sIGFlcyh0eXBpY2FsaXR5LCBzdGVyZW8sIGNvbG9yID0gY2F0ZWdvcnlfdHlwZSkpICsKICBnZW9tX2JveHBsb3Qob3V0bGllci5zaGFwZSA9IE5BKSArCiAgZ2VvbV9wb2ludChwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcmRvZGdlKCkpICsKICBsYWJzKHggPSAiVHlwaWNhbGl0eSIsIHkgPSAiU3RlcmVvdHlwZSIsIGNvbG9yID0gIkNhdGVnb3J5IFR5cGUiKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiM4NDlBQjkiLCAiIzQ2NTI2MyIpKSArCiAgdGhlbWVfY3NfdGFsaygpCmBgYAoKIyMjIyBNdWx0aXZlcnNlIE91dGxpZXIgQ29ycmVjdGlvbgpgYGB7ciBzdGVyZW90eXBlIH4gdHlwaWNhbGl0eSAqIGNhdGVnb3J5X3R5cGUgbXVsdGl2ZXJzZSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9CiMgTG9vcCBvdmVyIGFsbCBjb21iaW5hdGlvbnMgb2YgY3V0b2ZmcyBhbmQgdHJhbnNmb3JtYXRpb25zCm12X3N0ZXJlbyA8LSBkYXRhLmZyYW1lKAogIGN1dG9mZiA9IGMoIm5vbmUiLCAiZml4ZWQgMSIsICJmaXhlZCAxMCIsICJmaXhlZCAyMCIsICJmaXhlZCAzMCIsICJmaXhlZCA0MCIpLAogIGN1dG9mZl92YWx1ZSA9IGMoMCwgMSwgMTAsIDIwLCAzMCwgNDApKQpmb3IgKGMgaW4gc2VxX2xlbihucm93KG12X3N0ZXJlbykpKSB7CiAgbXZfZGF0IDwtIHN0ZXJlb19kYXQgJT4lCiAgICBmaWx0ZXIoc3RlcmVvID49IG12X3N0ZXJlbyRjdXRvZmZfdmFsdWVbY10pCgogICMgUnVuIEFOT1ZBCiAgbXZfbW9kIDwtIG12X2RhdCAlPiUKICAgIGFub3ZhX3Rlc3QoZHYgPSBzdGVyZW8sCiAgICAgIGVmZmVjdC5zaXplID0gInBlcyIsCiAgICAgIGJldHdlZW4gPSBjKGNhdGVnb3J5X3R5cGUsIHR5cGljYWxpdHkpKSAlPiUKICAgIGFzX3RpYmJsZSgpICU+JQogICAgcm93d2lzZSgpICU+JQogICAgbXV0YXRlKEYgPSBmb3JtYShgRmAsIDIpLCBwID0gZm9ybXAocCksIHBlcyA9IGZvcm1hKHBlcywgMywgRkFMU0UpKQoKICAjIFNhdmUgdGVzdCBzdGF0aXN0aWNzIGZvciBoMQogIG12X3N0ZXJlbyRgbiBleGNsdWRlZGBbY10gPC0KICAgIG5yb3coc3RlcmVvX2RhdCkgLSBucm93KG12X2RhdCkKICBtdl9zdGVyZW8kY3RfREZuW2NdIDwtIG12X21vZCRERm5bMV0KICBtdl9zdGVyZW8kY3RfREZkW2NdIDwtIG12X21vZCRERmRbMV0KICBtdl9zdGVyZW8kY3RfRltjXSA8LSBtdl9tb2QkRlsxXQogIG12X3N0ZXJlbyRjdF9wW2NdIDwtIG12X21vZCRwWzFdCiAgbXZfc3RlcmVvJGN0X3Blc1tjXSA8LSBtdl9tb2QkcGVzWzFdCiAgbXZfc3RlcmVvJHR5cF9ERm5bY10gPC0gbXZfbW9kJERGblsyXQogIG12X3N0ZXJlbyR0eXBfREZkW2NdIDwtIG12X21vZCRERmRbMl0KICBtdl9zdGVyZW8kdHlwX0ZbY10gPC0gbXZfbW9kJEZbMl0KICBtdl9zdGVyZW8kdHlwX3BbY10gPC0gbXZfbW9kJHBbMl0KICBtdl9zdGVyZW8kdHlwX3Blc1tjXSA8LSBtdl9tb2QkcGVzWzJdCiAgbXZfc3RlcmVvJGludF9ERm5bY10gPC0gbXZfbW9kJERGblszXQogIG12X3N0ZXJlbyRpbnRfREZkW2NdIDwtIG12X21vZCRERmRbM10KICBtdl9zdGVyZW8kaW50X0ZbY10gPC0gbXZfbW9kJEZbM10KICBtdl9zdGVyZW8kaW50X3BbY10gPC0gbXZfbW9kJHBbM10KICBtdl9zdGVyZW8kaW50X3Blc1tjXSA8LSBtdl9tb2QkcGVzWzNdCn0KIyBQcmludCBtdWx0aXZlcnNlIHRhYmxlCmtuaXRyOjprYWJsZShzZWxlY3QobXZfc3RlcmVvLCAtIGN1dG9mZl92YWx1ZSksCiAgZm9ybWF0ID0gIm1hcmtkb3duIikKYGBgCgpUbyB0ZXN0IHdoZXRoZXIgdGhlIG1hbmlwdWxhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgd2UgY29uZHVjdGVkIGEgbXVsdGl2ZXJzZSBhbmFseXNpcyB3aXRoIG11bHRpcGxlIGZpeGVkIG91dGxpZXIgY3V0b2Zmcy4gV2UgZXhjbHVkZWQgcGFydGljaXBhbnRzIHdpdGggdmFsdWVzIGJlbG93IDEsIDEwLCAyMCwgMzAsIG9yIDQwIGFuZCBjb25kdWN0ZWQgYSB0d28td2F5IGJldHdlZW4tc3ViamVjdHMgQU5PVkEgd2l0aCB0aGUgc3RlcmVvdHlwZSBtZWFzdXJlIGFzIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUgYW5kIHR5cGljYWxpdHkgYW5kIGNhdGVnb3J5IHR5cGUgYXMgYmV0d2Vlbi1zdWJqZWN0cyBmYWN0b3JzLiBUaGUgZWZmZWN0IG9mIHR5cGljYWxpdHkgd2FzIG1hcmdpbmFsbHkgc2lnbmlmaWNhbnQgd2l0aCBubyBvdXRsaWVyIGV4Y2x1c2lvbiBhbmQgc2lnbmlmaWNhbnQgd2l0aCBhbGwgZGlmZmVyZW50IG91dGxpZXIgdGhyZXNob2xkcy4gVGhlIGVmZmVjdCBvZiBjYXRlZ29yeSB0eXBlIGFuZCB0aGUgdHdvLXdheSBpbnRlcmFjdGlvbiB3ZXJlIG5vdCBzaWduaWZpY2FudCBpbiBhbnkgb2YgdGhlIHRlc3RzLiBUaGVzZSByZXN1bHRzIHByb3ZpZGUgbW9kZXJhdGUgc3VwcG9ydCBmb3IgdGhlIGVmZmVjdGl2ZW5lc3Mgb2Ygb3VyIG1hbmlwdWxhdGlvbi4KCiMjIyMgUVEtUGxvdApgYGB7ciBzdGVyZW90eXBlIH4gdHlwaWNhbGl0eSAqIGNhdGVnb3J5X3R5cGUgcXEsIG1lc3NhZ2UgPSBGQUxTRX0Kc3RlcmVvX2RhdCAlPiUKICBnZ3Bsb3QoLiwgYWVzKHNhbXBsZSA9IHN0ZXJlbykpICsKICBsYWJzKHggPSAiVGhlb3JldGljYWwgcXVhbnRpbGVzIiwgeSA9ICJEYXRhIHF1YW50aWxlcyIpICsKICBzdGF0X3FxKGNvbG9yID0gIiMwMDAwMDAiKSArCiAgc3RhdF9xcV9saW5lKGNvbG9yID0gIiMwMDAwMDAiKSArCiAgZmFjZXRfZ3JpZChjYXRlZ29yeV90eXBlIH4gdHlwaWNhbGl0eSwgbGFiZWxsZXIgPSAibGFiZWxfdmFsdWUiKSArCiAgdGhlbWVfY3NfdGFsaygpCmBgYAoKIyMgUGFydHkgQ2F0ZWdvcmllcwojIyMgQ291bnRlcnN0ZXJlb3R5cGUgUHJvYmFiaWxpdHkgey50YWJzZXR9CmBgYHtyIHRhcmdldCBpbmZlcmVuY2UgcGFydHkgfiB0eXBpY2FsaXR5LCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0KIyBQUkVSRUdJU1RFUkVECiMgSW5mZXJlbmNlIGRhdGEKaW5mX2RhdCA8LSBkYXQgJT4lCiAgZmlsdGVyKGRpYWdub3N0aWNpdHlfY29tcG9uZW50ID09ICJDT1VOVEVSUFJPQiIpICU+JQogIGZpbHRlcihjYXRlZ29yeV90eXBlID09ICJQQVJUWSIpICU+JQogIGZpbHRlcihpdGVtX3R5cGUgPT0gInRhcmdldCIpCgojIERlc2NyaXB0aXZlcwppbmZfZGVzYyA8LSBpbmZfZGF0ICU+JQogIGdyb3VwX2J5KHR5cGljYWxpdHkpICU+JQogIGdldF9zdW1tYXJ5X3N0YXRzKGluZiwgdHlwZSA9ICJtZWFuX3NkIikgJT4lCiAgbXV0YXRlKAogICAgY2k5NV9sb3cgPSBtZWFuIC0gMS45NiAqIHNkIC8gc3FydChuKSwKICAgIGNpOTVfdXBwID0gbWVhbiArIDEuOTYgKiBzZCAvIHNxcnQobikpCgojIEluZGVwZW5kZW50IHNhbXBsZXMgdC10ZXN0CmluZl90IDwtIGluZl9kYXQgJT4lCiAgdF90ZXN0KAogICAgaW5mIH4gdHlwaWNhbGl0eSwKICAgIGFsdGVybmF0aXZlID0gImxlc3MiLAogICAgcmVmLmdyb3VwID0gIkRJUyIpICU+JQogIG11dGF0ZShwID0gZm9ybXAocCwgdGV4dCA9IFRSVUUpLCBkZiA9IGZvcm1hKGRmLCAyKSwKICAgIHN0YXRpc3RpYyA9IGZvcm1hKHN0YXRpc3RpYykpCgojIENvaGVucyBkCmluZl9kIDwtIGluZl9kYXQgJT4lCiAgY29oZW5zX2QoaW5mIH4gdHlwaWNhbGl0eSwgcGFpcmVkID0gRkFMU0UpICU+JQogIHB1bGwoZWZmc2l6ZSkgJT4lCiAgZm9ybWEoKQoKIyBQcmludCB0LXRlc3QKaW5mX3JlcG9ydCA8LSBwYXN0ZTAoInQoIiwgaW5mX3QkZGYsICIpID0gIiwKICBpbmZfdCRzdGF0aXN0aWMsICIsICIsIGluZl90JHAsICIsIGQgPSAiLAogIGluZl9kKQoKIyBXSVRIIE9VVExJRVIgRVhDTFVTSU9OCiMgRXhjbHVkZSBvdXRsaWVycwppbmZfZGF0X2V4IDwtIGluZl9kYXQgJT4lCiAgZmlsdGVyKGluZiA+PSA0MCkKCiMgRGVzY3JpcHRpdmVzCmluZl9leF9kZXNjIDwtIGluZl9kYXRfZXggJT4lCiAgZ3JvdXBfYnkodHlwaWNhbGl0eSkgJT4lCiAgZ2V0X3N1bW1hcnlfc3RhdHMoaW5mLCB0eXBlID0gIm1lYW5fc2QiKSAlPiUKICBtdXRhdGUoCiAgICBjaTk1X2xvdyA9IG1lYW4gLSAxLjk2ICogc2QgLyBzcXJ0KG4pLAogICAgY2k5NV91cHAgPSBtZWFuICsgMS45NiAqIHNkIC8gc3FydChuKSkKCiMgSW5kZXBlbmRlbnQgc2FtcGxlcyB0LXRlc3QKaW5mX2V4X3QgPC0gaW5mX2RhdF9leCAlPiUKICB0X3Rlc3QoCiAgICBpbmYgfiB0eXBpY2FsaXR5LAogICAgYWx0ZXJuYXRpdmUgPSAibGVzcyIsCiAgICByZWYuZ3JvdXAgPSAiRElTIikgJT4lCiAgbXV0YXRlKHAgPSBmb3JtcChwLCB0ZXh0ID0gVFJVRSksIGRmID0gZm9ybWEoZGYsIDIpLAogICAgc3RhdGlzdGljID0gZm9ybWEoc3RhdGlzdGljKSkKCiMgQ29oZW5zIGQKaW5mX2V4X2QgPC0gaW5mX2RhdF9leCAlPiUKICBjb2hlbnNfZChpbmYgfiB0eXBpY2FsaXR5LCBwYWlyZWQgPSBGQUxTRSkgJT4lCiAgcHVsbChlZmZzaXplKSAlPiUKICBmb3JtYSgpCgojIFByaW50IHQtdGVzdAppbmZfZXhfcmVwb3J0IDwtIHBhc3RlMCgidCgiLCBpbmZfZXhfdCRkZiwgIikgPSAiLAogIGluZl9leF90JHN0YXRpc3RpYywgIiwgIiwgaW5mX2V4X3QkcCwgIiwgZCA9ICIsCiAgaW5mX2V4X2QpCgojIFdJTENPWE9OCiMgT25lLXNpZGVkIFdpbGNveG9uIHJhbmstc3VtIHRlc3QKaW5mX3djeCA8LSBpbmZfZGF0ICU+JQogIHdpbGNveF90ZXN0KAogICAgaW5mIH4gdHlwaWNhbGl0eSwKICAgIGFsdGVybmF0aXZlID0gImxlc3MiLAogICAgcmVmLmdyb3VwID0gIkRJUyIpCgojIFdpbGNveG9uIGVmZmVjdCBzaXplIHIKaW5mX3djeF9yIDwtIGluZl9kYXQgJT4lCiAgd2lsY294X2VmZnNpemUoaW5mIH4gdHlwaWNhbGl0eSwKICByZWYuZ3JvdXAgPSAiRElTIikgJT4lCiAgcHVsbChlZmZzaXplKQoKIyBQcmludCB3aWxjb3hvbiB0ZXN0CmluZl93Y3hfcmVwb3J0IDwtIHBhc3RlMCgiWiA9ICIsIGZvcm1hKGluZl93Y3hfciAqIHNxcnQobnJvdyhpbmZfZGF0KSAvIDIpKSwKICAiLCAiLCBmb3JtcChpbmZfd2N4JHAsIFRSVUUpLCAiLCByID0gIiwgZm9ybWEoaW5mX3djeF9yKSkKYGBgCgpUbyB0ZXN0IG91ciBoeXBvdGhlc2lzIGluIHRoZSBwYXJ0eSBjYXRlZ29yeSBjb25kaXRpb24sIHdlIGNvbmR1Y3RlZCBhIHByZXJlZ2lzdGVyZWQgaW5kZXBlbmRlbnQgc2FtcGxlcyB0LXRlc3QgY29tcGFyaW5nIHRhcmdldCBpbmZlcmVuY2VzIG9mIHBhcnRpc2Fuc2hpcCBpbiB0aGUgc3RlcmVvdHlwZS1jb25maXJtaW5nIGFuZCBzdGVyZW90eXBlLWRpc2NvbmZpcm1pbmcgY29uZGl0aW9ucy4gVGhlIHRhcmdldCBpbmZlcmVuY2VzIGluIHRoZSBkaXNjb25maXJtaW5nIGNvbmRpdGlvbiBgciByZXBvcnRfZGVzYyhpbmZfZGVzYywgMSlgIHdlcmUgbm90IHNpZ25pZmljYW50bHkgbG93ZXIgdGhhbiBpbiB0aGUgc3RlcmVvdHlwZS1jb25maXJtaW5nIGNvbmRpdGlvbiBgciByZXBvcnRfZGVzYyhpbmZfZGVzYywgMilgLCBgciBpbmZfcmVwb3J0YC4gVG8gaW52ZXN0aWdhdGUgd2hldGhlciB0aGlzIHdhcyBkdWUgdG8gc3RhdGlzdGljYWwgb3V0bGllcnMsIHdlIGNvbmR1Y3RlZCBhbm90aGVyIGluZGVwZW5kZW50IHNhbXBsZXMgdC10ZXN0IGV4Y2x1ZGluZyBwYXJ0aWNpcGFudHMgd2l0aCB2YWx1ZXMgYmVsb3cgNDAuIEFmdGVyIGV4Y2x1c2lvbiwgdGhlIGluZmVyZW5jZXMgaW4gdGhlIGRpc2NvbmZpcm1pbmcgY29uZGl0aW9uIGByIHJlcG9ydF9kZXNjKGluZl9leF9kZXNjLCAxKWAgd2VyZSBzaWduaWZpY2FudGx5IGxvd2VyIHRoYW4gaW4gdGhlIGNvbmZpcm1pbmcgY29uZGl0aW9uIGByIHJlcG9ydF9kZXNjKGluZl9leF9kZXNjLCAyKWAsIGByIGluZl9leF9yZXBvcnRgLgoKIyMjIyBPdXRsaWVyIERldGVjdGlvbgpgYGB7ciB0YXJnZXQgaW5mZXJlbmNlIHBhcnR5IH4gdHlwaWNhbGl0eSBvdXRsaWVyLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0KaW5mX2RhdCAlPiUKICBnZ3Bsb3QoLiwgYWVzKHR5cGljYWxpdHksIGluZikpICsKICBnZW9tX2JveHBsb3Qob3V0bGllci5zaGFwZSA9IE5BKSArCiAgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjIpICsKICBsYWJzKHggPSAiVHlwaWNhbGl0eSIsIHkgPSAiSW5mZXJlbmNlcyIpICsKICB0aGVtZV9jc190YWxrKCkKYGBgCgojIyMjIE11bHRpdmVyc2UgT3V0bGllciBDb3JyZWN0aW9uCmBgYHtyIHRhcmdldCBpbmZlcmVuY2UgcGFydHkgfiB0eXBpY2FsaXR5IG11bHRpdmVyc2UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQojIExvb3Agb3ZlciBhbGwgY29tYmluYXRpb25zIG9mIGN1dG9mZnMgYW5kIHRyYW5zZm9ybWF0aW9ucwptdiA8LSBkYXRhLmZyYW1lKAogIGN1dG9mZiA9IGMoIm5vbmUiLCAiZml4ZWQgMjAiLCAiZml4ZWQgMzAiLCAiZml4ZWQgNDAiLAogICAgIk1kbiDCsSAyLjUgSVFSIiwgIk1kbiDCsSAyLjAgSVFSIiwgIk1kbiDCsSAxLjUgSVFSIiwgIk1kbiDCsSAxLjAgSVFSIiksCiAgY3V0b2ZmX3R5cGUgPSBjKCJmaXhlZCIsICJmaXhlZCIsICJmaXhlZCIsICJmaXhlZCIsCiAgICAiTWRuIMKxIElRUiIsICJNZG4gwrEgSVFSIiwgIk1kbiDCsSBJUVIiLCAiTWRuIMKxIElRUiIpLAogIGN1dG9mZl92YWx1ZSA9IGMoMCwgMjAsIDMwLCA0MCwgMi41LCAyLjAsIDEuNSwgMS4wKSkKZm9yIChjIGluIHNlcV9sZW4obnJvdyhtdikpKSB7CiAgaWYgKG12JGN1dG9mZl90eXBlW2NdID09ICJmaXhlZCIpIHsKICAgIG12X2RhdCA8LSBpbmZfZGF0ICU+JQogICAgICBmaWx0ZXIoaW5mID49IG12JGN1dG9mZl92YWx1ZVtjXSkKICB9IGVsc2UgaWYgKG12JGN1dG9mZl90eXBlW2NdID09ICJNZG4gwrEgSVFSIikgewogICAgbXZfZGF0IDwtIGluZl9kYXQgJT4lCiAgICAgIGdyb3VwX2J5KHR5cGljYWxpdHkpICU+JQogICAgICBmaWx0ZXIoIWlzX291dGxpZXIoaW5mLCBjb2VmID0gbXYkY3V0b2ZmX3ZhbHVlW2NdKSkgJT4lCiAgICAgIHVuZ3JvdXAoKQogIH0KICAjIEluZGVwZW5kZW50IHNhbXBsZXMgdC10ZXN0CiAgbXZfdCA8LSBtdl9kYXQgJT4lCiAgICB0X3Rlc3QoCiAgICAgIGluZiB+IHR5cGljYWxpdHksCiAgICAgIGFsdGVybmF0aXZlID0gImxlc3MiLAogICAgICByZWYuZ3JvdXAgPSAiRElTIikgJT4lCiAgICBtdXRhdGUocCA9IGZvcm1wKHAsIHRleHQgPSBGQUxTRSksIGRmID0gZm9ybWEoZGYsIDIpLAogICAgICBzdGF0aXN0aWMgPSBmb3JtYShzdGF0aXN0aWMpKQoKICAjIENvaGVucyBkCiAgbXZfZCA8LSBtdl9kYXQgJT4lCiAgICBjb2hlbnNfZChpbmYgfiB0eXBpY2FsaXR5KSAlPiUKICAgIHB1bGwoZWZmc2l6ZSkgJT4lCiAgICBmb3JtYSgpCgogICMgU2F2ZSB0ZXN0IHN0YXRpc3RpY3MgZm9yIGgxCiAgbXYkYG4gZXhjbHVkZWRgW2NdIDwtIG5yb3coaW5mX2RhdCkgLSBucm93KG12X2RhdCkKICBtdiRkZltjXSA8LSBtdl90JGRmCiAgbXYkdFtjXSA8LSBtdl90JHN0YXRpc3RpYwogIG12JHBbY10gPC0gbXZfdCRwCiAgbXYkZFtjXSA8LSBtdl9kCn0KIyBQcmludCBtdWx0aXZlcnNlIHRhYmxlCmtuaXRyOjprYWJsZShzZWxlY3QobXYsIC1jdXRvZmZfdHlwZSwgLSBjdXRvZmZfdmFsdWUpLCBmb3JtYXQgPSAibWFya2Rvd24iKQpgYGAKClRvIGludmVzdGlnYXRlIHRoZSByb2J1c3RuZXNzIG9mIHRoZSBlZmZlY3QgYWNyb3NzIHZhcmlvdXMgb3V0bGllciBleGNsdXNpb24gY3JpdGVyaWEsIHdlIGNvbmR1Y3RlZCBhIG11bHRpdmVyc2UgYW5hbHlzaXMuIFdlIHBlcmZvcm1lZCBpbmRlcGVuZGVudCBzYW1wbGVzIHQtdGVzdHMgYWNyb3NzIHNldmVyYWwgZml4ZWQgYW5kIGRpc3RyaWJ1dGlvbi1iYXNlZCB0aHJlc2hvbGRzLiBGb3IgdGhlIGZpeGVkIHRocmVzaG9sZHMgd2UgZXhjbHVkZWQgcmF0aW5ncyBiZWxvdyAxNSwgMzAsIG9yIDQ1IHVuaWZvcm1seSBhY3Jvc3MgYm90aCBleHBlcmltZW50YWwgY29uZGl0aW9ucy4gRm9yIHRoZSBkaXN0cmlidXRpb24tYmFzZWQgY3JpdGVyaWEgd2UgZXhjbHVkZWQgcmF0aW5ncyB0aGF0IHdlcmUgMS4wLCAxLjUsIDIuMCwgb3IgMi41IHRpbWVzIHRoZSBJUVIgYWJvdmUgb3IgYmVsb3cgdGhlIGNvbmRpdGlvbiBtZWRpYW4uIFRoZSBlZmZlY3Qgd2FzIHNpZ25pZmljYW50IGFjcm9zcyBhbGwgc2V2ZW4gdGhyZXNob2xkcy4gVGhlc2UgcmVzdWx0cyBzdWdnZXN0IHRoYXQgdGhlIGVmZmVjdCBtYXkgaGF2ZSBiZWVuIG9ic2N1cmVkIGR1ZSB0byBtb2RlbCBvdXRsaWVycy4gSG93ZXZlciwgcmVtb3Zpbmcgb3V0bGllcnMgbWF5IGFsc28gaGF2ZSBpbnRyb2R1Y2VkIGJpYXMsIGZvciBpbnN0YW5jZSBpZiB3ZSBpbmFkdmVydGFudGx5IHJlbW92ZWQgbW9yZSB0cnVlIG1vZGVsIG91dGxpZXJzIGluIG9uZSBvZiB0aGUgdHdvIGV4cGVyaW1lbnRhbCBjb25kaXRpb25zLiBUaGlzIHJpc2sgaXMgZXNwZWNpYWxseSBoaWdoIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi1iYXNlZCB0aHJlc2hvbGRzIHdlIHVzZWQ6IElmIGluIHRoZSBkaXNjb25maXJtaW5nIGNvbmRpdGlvbiB0aGUgZGlzdHJpYnV0aW9uIG9mIGluZmVyZW5jZXMgaXMgc2hpZnRlZCB0b3dhcmRzIHRoZSBzY2FsZSBtaWRwb2ludCwgdGhpcyB3b3VsZCBtYWtlIGxvdyBvdXRsaWVycyBtb3JlIGRpZmZpY3VsdCB0byBkZXRlY3QgKGR1ZSB0byBhIGZsb29yIGVmZmVjdCkuIFRodXMsIGFwcGx5aW5nIHRoZSB0aHJlc2hvbGRzIG1heSBoYXZlIGFydGlmaWNpYWxseSBpbmZsYXRlZCB0aGUgZWZmZWN0IGJ5IHByZWRvbWluYW50bHkgcmVtb3ZpbmcgbG93IG91dGxpZXJzIGluIHRoZSBjb25maXJtaW5nIGNvbmRpdGlvbi4gQXMgdGhpcyByaXNrIGlzIHJlZHVjZWQgYnkgdGhlIGZpeGVkIHRocmVzaG9sZHMsIHRoZXNlIHByb3ZpZGUgYSBtb3JlIGNvbnNlcnZhdGl2ZSBlc3RpbWF0ZSBvZiB0aGUgdHJ1ZSBlZmZlY3QuCgpBbHRob3VnaCB0aGVzZSByZXN1bHRzIHN1Z2dlc3QgdGhhdCB0aGVyZSBtYXkgYmUgYW4gZWZmZWN0IG9mIHR5cGljYWxpdHkgb24gaW5mZXJlbmNlcyBvZiBwYXJ0aXNhbnNoaXAsIHRoaXMgZWZmZWN0IHNlZW1zIHRvIGJlIGNvbnNpZGVyYWJseSBzbWFsbGVyIGFuZCBsZXNzIHJvYnVzdCBjb21wYXJlZCB0byB0aGUgcHJldmlvdXMgc3R1ZHkuIFRoaXMgbWF5IGJlIGJlY2F1c2Ugd2UgcmVtb3ZlZCB0aGUgcHJlLW1lYXN1cmVtZW50IGFuZCBjaGFuZ2VkIHRoZSBjb3ZlciBzdG9yeS4gQXMgd2UgaGF2ZSBhcmd1ZWQgYWJvdmUsIHRoZSByZXBlYXRlZC1tZWFzdXJlcyBkZXNpZ24gbWFkZSBpdCB2ZXJ5IGVhc3kgdG8gaW5mZXIgb3VyIHJlc2VhcmNoIGh5cG90aGVzaXMuIFBhcnQgb2YgdGhlIG9ic2VydmVkIGVmZmVjdCBpbiB0aGUgcHJldmlvdXMgc3R1ZHkgbWF5IHRoZXJlZm9yZSBoYXZlIGJlZW4gdGhlIGNvbnNlcXVlbmNlIG9mIGRlbWFuZCBlZmZlY3RzLiBBbm90aGVyIHBvc3NpYmlsaXR5IGlzIHRoYXQgbWVhc3VyaW5nIHRoZSBpbmZlcmVuY2VzIGJlZm9yZSBwcmVzZW50aW5nIHRoZSBjb3VudGVyc3RlcmVvdHlwaWNhbCBleGVtcGxhciBsZWQgdG8gYW4gYWN0aXZhdGlvbiBvZiB0aGUgcmVsZXZhbnQga25vd2xlZGdlIHN0cnVjdHVyZXMgYW5kIHRoZXJlZm9yZSBmYWNpbGl0YXRlZCB0aGUgbGVhcm5pbmcgb2YgdGhlIG5ldyBpbmZvcm1hdGlvbi4gSG93ZXZlciwgYXMgbmVpdGhlciBkZW1hbmQgY2hhcmFjdGVyaXN0aWNzIG5vciBwcmUtYWN0aXZhdGlvbiBvZiB0aGUgcmVsZXZhbnQga25vd2xlZGdlIHN0cnVjdHVyZXMgd2lsbCBiZSBwcmVzZW50IHdoZW4gd2UgY29tZSBhY3Jvc3MgYSBjb3VudGVyc3RlcmVvdHlwZSBpbiByZWFsIGxpZmUsIHRoZSBlZmZlY3RzIG9mIHRoZSBjdXJyZW50IHN0dWR5IG1heSBwcm92aWRlIGEgbW9yZSByZWFsaXN0aWMgZXN0aW1hdGUgb2YgdGhlIGNoYW5nZSBpbiBpbmZlcmVuY2VzIHRoYXQgaXMgaW5kdWNlZCBieSBjb3VudGVyc3RlcmVvdHlwZXMuCgojIyMjIFFRLVBsb3QKYGBge3IgdGFyZ2V0IGluZmVyZW5jZSBwYXJ0eSB+IHR5cGljYWxpdHkgcXEsIG1lc3NhZ2UgPSBGQUxTRX0KaW5mX2RhdF9leCAlPiUKICBnZ3Bsb3QoLiwgYWVzKHNhbXBsZSA9IGluZikpICsKICBsYWJzKHggPSAiVGhlb3JldGljYWwgcXVhbnRpbGVzIiwgeSA9ICJEYXRhIHF1YW50aWxlcyIpICsKICBzdGF0X3FxKGNvbG9yID0gIiMwMDAwMDAiKSArCiAgc3RhdF9xcV9saW5lKGNvbG9yID0gIiMwMDAwMDAiKSArCiAgZmFjZXRfZ3JpZCh+IHR5cGljYWxpdHksIGxhYmVsbGVyID0gImxhYmVsX3ZhbHVlIikgKwogIHRoZW1lX2NzX3RhbGsoKQpgYGAKCiMjIyMgRGVzY3JpcHRpdmVzCmBgYHtyIHRhcmdldCBpbmZlcmVuY2UgcGFydHkgfiB0aW1lICogdHlwaWNhbGl0eSBkZXNjcmlwdGl2ZXN9CmtuaXRyOjprYWJsZShpbmZfZGVzYywgZm9ybWF0ID0gIm1hcmtkb3duIikKYGBgCgojIyMjIEhpc3RvZ3JhbQpgYGB7ciB0YXJnZXQgaW5mZXJlbmNlIHBhcnR5IH4gdGltZSAqIHR5cGljYWxpdHkgaGlzdG9ncmFtfQppbmZfZGF0X2V4ICU+JQogIG11dGF0ZShpbmZfYmluID0gY3V0KGluZiwKICAgIGJyZWFrcyA9IDksIGxhYmVscyA9IEZBTFNFLCBpbmNsdWRlLmxvd2VzdCA9IFRSVUUpKSAlPiUKICBnZ3Bsb3QoKSArCiAgZ2VvbV9iYXIocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZShwcmVzZXJ2ZSA9ICJzaW5nbGUiKSwKICBhZXMoeCA9IGluZl9iaW4sIHkgPSBhZnRlcl9zdGF0KHByb3ApLCBmaWxsID0gdHlwaWNhbGl0eSksCiAgICB3aWR0aCA9IDAuOCkgKwogIGxhYnModGl0bGUgPSAiSGlzdG9ncmFtbSBvZiBJbmZlcmVuY2UgU2NvcmVzIiwKICAgIHggPSAiSW5mZXJlbmNlIFNjb3JlcyIsCiAgICB5ID0gIlByb3BvcnRpb24iLCBmaWxsID0gIlR5cGljYWxpdHkiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzg0OUFCOSIsICIjNDY1MjYzIikpICsKICB0aGVtZV9jc190YWxrKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpKQpgYGAKCiMjIyMgTW9kZXJhdGlvbiBieSBwYXJ0aXNhbnNoaXAKYGBge3IgdGFyZ2V0IGluZmVyZW5jZSBwYXJ0eSB+IHR5cGljYWxpdHkgKiBwYXJ0aXNhbnNoaXB9CiMgUHJlcGFyZSBkYXRhCmluZl9wYXJfZGF0IDwtIGluZl9kYXRfZXggJT4lCiAgIyBTZWxlY3QgcGFydGljaXBhbnRzIHdobyBpZGVudGlmeSBhcyBSZXB1YmxpY2FuLCBEZW1vY3JhdCwgb3IgSW5kZXBlbmRlbnQKICBmaWx0ZXIocGFydGlzYW5faWRlbnRpdHkgJWluJSBjKCJSZXB1YmxpY2FuIiwgIkRlbW9jcmF0IiwgIkluZGVwZW5kZW50IikpCgojIERlc2NyaXB0aXZlcwppbmZfcGFyX2Rlc2MgPC0gaW5mX3Bhcl9kYXQgJT4lCiAgZ3JvdXBfYnkocGFydGlzYW5faWRlbnRpdHksIHR5cGljYWxpdHkpICU+JQogIGdldF9zdW1tYXJ5X3N0YXRzKGluZiwgdHlwZSA9ICJtZWFuX3NkIikgJT4lCiAgbXV0YXRlKAogICAgY2k5NV9sb3cgPSBtZWFuIC0gMS45NiAqIHNkIC8gc3FydChuKSwKICAgIGNpOTVfdXBwID0gbWVhbiArIDEuOTYgKiBzZCAvIHNxcnQobikpCgojIFJ1biBBTk9WQQppbmZfcGFyX21vZCA8LSBpbmZfcGFyX2RhdCAlPiUKICBhbm92YV90ZXN0KGR2ID0gaW5mLAogICAgZWZmZWN0LnNpemUgPSAicGVzIiwKICAgIGJldHdlZW4gPSBjKHBhcnRpc2FuX2lkZW50aXR5LCB0eXBpY2FsaXR5KSkgJT4lCiAgYXNfdGliYmxlKCkgJT4lCiAgcm93d2lzZSgpICU+JQogIG11dGF0ZShGID0gZm9ybWEoYEZgLCAyKSwgcCA9IGZvcm1wKHApLCBwZXMgPSBmb3JtYShwZXMsIDMsIEZBTFNFKSkKCmtuaXRyOjprYWJsZShpbmZfcGFyX21vZCwgZm9ybWF0ID0gIm1hcmtkb3duIikKYGBgCgpJdCBtYXkgYmUgcG9zc2libGUgdGhhdCB0aGUgZWZmZWN0IG9mIGRpYWdub3N0aWNpdHkgb24gdGhlIGluZmVyZW5jZXMgZGVwZW5kcyBvbiB0aGUgcGFydGljaXBhbnQncyBwYXJ0aXNhbnNoaXAuIFRvIHRlc3QgdGhpcywgd2UgY29uZHVjdGVkIGEgdHdvLXdheSBiZXR3ZWVuLXN1YmplY3RzIEFOT1ZBIHdpdGggdGhlIHRhcmdldCBpbmZlcmVuY2UgYXMgdGhlIGRlcGVuZGVudCB2YXJpYWJsZSBhbmQgdGhlIHBhcnRpY2lwYW50cycgcGFydHkgaWRlbnRpZmljYXRpb24gYW5kIHR5cGljYWxpdHkgYXMgYmV0d2Vlbi1zdWJqZWN0cyBmYWN0b3JzLiBXZSBmb3VuZCBhIHNpZ25pZmljYW50IGVmZmVjdCBvZiB0eXBpY2FsaXR5LiBBbGwgb3RoZXIgZWZmZWN0cyB3ZXJlIG5vbi1zaWduaWZpY2FudC4KCiMjIyMgTW9kZXJhdGlvbiBieSBwYXJ0aXNhbiBmaXQKYGBge3IgdGFyZ2V0IGluZmVyZW5jZSBwYXJ0eSB+IHR5cGljYWxpdHkgKiBwYXJ0aXNhbiBmaXR9CiMgUHJlcGFyZSBkYXRhCmluZl9wYXJfZml0X2RhdCA8LSBpbmZfZGF0X2V4ICU+JQogICMgU2VsZWN0IHBhcnRpY2lwYW50cyB3aG8gaWRlbnRpZnkgd2l0aCBvbmUgb2YgdGhlIG1ham9yIHBhcnRpZXMKICBmaWx0ZXIocGFydGlzYW5faWRlbnRpdHkgJWluJSBjKCJSZXB1YmxpY2FuIiwgIkRlbW9jcmF0IikpICU+JQogICMgUmVjb2RlIHBhcnRpc2FuIGlkZW50aXR5CiAgbXV0YXRlKHBhcnRpc2FuX2lkZW50aXR5ID0gY2FzZV9tYXRjaChwYXJ0aXNhbl9pZGVudGl0eSwKICAgICJEZW1vY3JhdCIgfiAiREVNIiwgIlJlcHVibGljYW4iIH4gIlJFUCIpKSAlPiUKICBtdXRhdGUocGFydGlzYW5fZml0ID0gYXMuZmFjdG9yKGlmZWxzZSgKICAgIHBhcnRpc2FuX2lkZW50aXR5ID09IHRhcmdldF9jYXRlZ29yeV9sYWJlbCwKICAgICJzYW1lIiwgImRpZmZlcmVudCIpKSkKCiMgRGVzY3JpcHRpdmVzCmluZl9wYXJfZml0X2Rlc2MgPC0gaW5mX3Bhcl9maXRfZGF0ICU+JQogIGdyb3VwX2J5KHBhcnRpc2FuX2ZpdCwgdHlwaWNhbGl0eSkgJT4lCiAgZ2V0X3N1bW1hcnlfc3RhdHMoaW5mLCB0eXBlID0gIm1lYW5fc2QiKSAlPiUKICBtdXRhdGUoCiAgICBjaTk1X2xvdyA9IG1lYW4gLSAxLjk2ICogc2QgLyBzcXJ0KG4pLAogICAgY2k5NV91cHAgPSBtZWFuICsgMS45NiAqIHNkIC8gc3FydChuKSkKCiMgUnVuIEFOT1ZBCmluZl9wYXJfZml0X21vZCA8LSBpbmZfcGFyX2ZpdF9kYXQgJT4lCiAgYW5vdmFfdGVzdChkdiA9IGluZiwKICAgIGVmZmVjdC5zaXplID0gInBlcyIsCiAgICBiZXR3ZWVuID0gYyhwYXJ0aXNhbl9maXQsIHR5cGljYWxpdHkpKSAlPiUKICBhc190aWJibGUoKSAlPiUKICByb3d3aXNlKCkgJT4lCiAgbXV0YXRlKEYgPSBmb3JtYShgRmAsIDIpLCBwID0gZm9ybXAocCksIHBlcyA9IGZvcm1hKHBlcywgMywgRkFMU0UpKQoKa25pdHI6OmthYmxlKGluZl9wYXJfZml0X21vZCwgZm9ybWF0ID0gIm1hcmtkb3duIikKYGBgCgpJdCBtYXkgYmUgcG9zc2libGUgdGhhdCB0aGUgZWZmZWN0IG9mIGRpYWdub3N0aWNpdHkgb24gdGhlIGluZmVyZW5jZXMgZGVwZW5kcyBvbiB0aGUgZml0IGJldHdlZW4gdGhlIHBhcnRpY2lwYW50J3MgcGFydHkgaWRlbnRpZmljYXRpb24gYW5kIHRoZSB0YXJnZXQncyBwYXJ0aXNhbnNoaXAuIFdlIHRoZXJlZm9yZSByYW4gYW4gZXhwbG9yYXRvcnkgYW5hbHlzaXMgZXhhbWluaW5nIHRoZSByb2xlIG9mIGlkZW9sb2dpY2FsIGZpdCAoaS5lLiwgd2hldGhlciBwYXJ0aWNpcGFudCBhbmQgdGFyZ2V0IGJlbG9uZyB0byB0aGUgc2FtZSBjYXRlZ29yeSBvciBhIGRpZmZlcmVudCBvbmUpLiBXZSBleGNsdWRlZCBwYXJ0aWNpcGFudHMgY2xhc3NpZmllZCBhcyBJbmRlcGVuZGVudHMgYW5kIGNvbmR1Y3RlZCBhIHR3by13YXkgYmV0d2Vlbi1zdWJqZWN0cyBBTk9WQSB3aXRoIHRoZSB0YXJnZXQgaW5mZXJlbmNlIGFzIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUgYW5kIGlkZW9sb2dpY2FsIGZpdCBhbmQgdHlwaWNhbGl0eSBhcyBiZXR3ZWVuLXN1YmplY3RzIGZhY3RvcnMuIFdlIGZvdW5kIGEgc2lnbmlmaWNhbnQgZWZmZWN0IG9mIHR5cGljYWxpdHkuIEFsbCBvdGhlciBlZmZlY3RzIHdlcmUgbm9uLXNpZ25pZmljYW50LgoKIyMjIyBNb2RlcmF0aW9uIGJ5IHBvbGl0aWNhbCBpc3N1ZQpgYGB7ciB0YXJnZXQgaW5mZXJlbmNlIHBhcnR5IH4gdHlwaWNhbGl0eSAqIGlzc3VlfQojIERlc2NyaXB0aXZlcwppbmZfaXNzdWVfZGVzYyA8LSBpbmZfZGF0X2V4ICU+JQogIGdyb3VwX2J5KGlzc3VlLCB0eXBpY2FsaXR5KSAlPiUKICBnZXRfc3VtbWFyeV9zdGF0cyhpbmYsIHR5cGUgPSAibWVhbl9zZCIpICU+JQogIG11dGF0ZSgKICAgIGNpOTVfbG93ID0gbWVhbiAtIDEuOTYgKiBzZCAvIHNxcnQobiksCiAgICBjaTk1X3VwcCA9IG1lYW4gKyAxLjk2ICogc2QgLyBzcXJ0KG4pKQoKIyBSdW4gQU5PVkEKaW5mX2lzc3VlX21vZCA8LSBpbmZfZGF0X2V4ICU+JQogIGFub3ZhX3Rlc3QoZHYgPSBpbmYsCiAgICBlZmZlY3Quc2l6ZSA9ICJwZXMiLAogICAgYmV0d2VlbiA9IGMoaXNzdWUsIHR5cGljYWxpdHkpKSAlPiUKICBhc190aWJibGUoKSAlPiUKICByb3d3aXNlKCkgJT4lCiAgbXV0YXRlKEYgPSBmb3JtYShgRmAsIDIpLCBwID0gZm9ybXAocCksIHBlcyA9IGZvcm1hKHBlcywgMywgRkFMU0UpKQoKa25pdHI6OmthYmxlKGluZl9pc3N1ZV9tb2QsIGZvcm1hdCA9ICJtYXJrZG93biIpCmBgYAoKV2UgcmFuIGFub3RoZXIgZXhwbG9yYXRvcnkgYW5hbHlzaXMgdG8gdGVzdCB3aGV0aGVyIHRoZSBlZmZlY3Qgb2YgZGlhZ25vc3RpY2l0eSBvbiB0aGUgaW5mZXJlbmNlcyB3YXMgbW9kZXJhdGVkIGJ5IHRoZSBpc3N1ZSBmb3Igd2hpY2ggZGlhZ25vc3RpY2l0eSB3YXMgbWFuaXB1bGF0ZWQuIFdlIGNvbmR1Y3RlZCBhIHR3by13YXkgYmV0d2Vlbi1zdWJqZWN0cyBBTk9WQSB3aXRoIHRoZSB0YXJnZXQgaW5mZXJlbmNlIGFzIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUgYW5kIGlzc3VlIGFuZCB0eXBpY2FsaXR5IGFzIGJldHdlZW4tc3ViamVjdHMgZmFjdG9ycy4gV2UgZm91bmQgYSBzaWduaWZpY2FudCBlZmZlY3Qgb2YgdHlwaWNhbGl0eS4gQWxsIG90aGVyIGVmZmVjdHMgd2VyZSBub24tc2lnbmlmaWNhbnQuCgojIyMjIE1vZGVyYXRpb24gYnkgdHlwaWNhbGl0eSByYXRpbmcKYGBge3IgdGFyZ2V0IGluZmVyZW5jZSBwYXJ0eSB+IHR5cGljYWxpdHkgKiB0eXBpY2FsaXR5X3JhdGluZywgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0V9CmluZl90eXBfZGF0IDwtIGluZl9kYXRfZXggJT4lCiAgZ3JvdXBfYnkodHlwaWNhbGl0eSkgJT4lCiAgbXV0YXRlKHR5cGljYWxpdHlfYmluID0gbnRpbGUodHlwaWNhbGl0eV90YXJnZXQsIDIpKSAlPiUKICBtdXRhdGUodHlwaWNhbGl0eV9iaW4gPSBmYWN0b3IodHlwaWNhbGl0eV9iaW4sIGxhYmVscyA9IGMoImxvdyIsICJoaWdoIikpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKHR5cGljYWxpdHlfdGFyZ2V0X2MgPSB0eXBpY2FsaXR5X3RhcmdldCAtIG1lYW4odHlwaWNhbGl0eV90YXJnZXQpKQojIERWOiBUeXBpY2FsaXR5CiMgRGVzY3JpcHRpdmVzCnR5cF9kZXNjIDwtIGluZl90eXBfZGF0ICU+JQogIGdyb3VwX2J5KHR5cGljYWxpdHkpICU+JQogIGdldF9zdW1tYXJ5X3N0YXRzKHR5cGljYWxpdHlfdGFyZ2V0LCB0eXBlID0gIm1lYW5fc2QiKSAlPiUKICBtdXRhdGUoCiAgICBjaTk1X2xvdyA9IG1lYW4gLSAxLjk2ICogc2QgLyBzcXJ0KG4pLAogICAgY2k5NV91cHAgPSBtZWFuICsgMS45NiAqIHNkIC8gc3FydChuKSkKCiMgSW5kZXBlbmRlbnQgc2FtcGxlcyB0LXRlc3QKdHlwX3QgPC0gaW5mX3R5cF9kYXQgJT4lCiAgdF90ZXN0KAogICAgdHlwaWNhbGl0eV90YXJnZXQgfiB0eXBpY2FsaXR5LAogICAgYWx0ZXJuYXRpdmUgPSAibGVzcyIsCiAgICByZWYuZ3JvdXAgPSAiRElTIikgJT4lCiAgbXV0YXRlKHAgPSBmb3JtcChwLCB0ZXh0ID0gVFJVRSksIGRmID0gZm9ybWEoZGYsIDIpLAogICAgc3RhdGlzdGljID0gZm9ybWEoc3RhdGlzdGljKSkKCiMgQ29oZW5zIGQKdHlwX2QgPC0gaW5mX3R5cF9kYXQgJT4lCiAgY29oZW5zX2QodHlwaWNhbGl0eV90YXJnZXQgfiB0eXBpY2FsaXR5LCBwYWlyZWQgPSBGQUxTRSkgJT4lCiAgcHVsbChlZmZzaXplKSAlPiUKICBmb3JtYSgpCgojIFByaW50IHQtdGVzdAp0eXBfcmVwb3J0IDwtIHBhc3RlMCgidCgiLCB0eXBfdCRkZiwgIikgPSAiLAogIHR5cF90JHN0YXRpc3RpYywgIiwgIiwgdHlwX3QkcCwgIiwgZCA9ICIsCiAgdHlwX2QpCgojIERWOiBJbmZlcmVuY2VzCmluZl90eXBfZGVzYyA8LSBpbmZfdHlwX2RhdCAlPiUKICBncm91cF9ieSh0eXBpY2FsaXR5X2JpbiwgdHlwaWNhbGl0eSkgJT4lCiAgZ2V0X3N1bW1hcnlfc3RhdHMoaW5mLCB0eXBlID0gIm1lYW5fc2QiKSAlPiUKICBtdXRhdGUoCiAgICBjaTk1X2xvdyA9IG1lYW4gLSAxLjk2ICogc2QgLyBzcXJ0KG4pLAogICAgY2k5NV91cHAgPSBtZWFuICsgMS45NiAqIHNkIC8gc3FydChuKSkKCiMgUnVuIHJlZ3Jlc3Npb24KY29udHJhc3RzKGluZl90eXBfZGF0JHR5cGljYWxpdHkpIDwtIGMoMSwgMCkKaW5mX3R5cF9tb2QgPC0gbG0oCiAgICBkYXRhID0gaW5mX3R5cF9kYXQsCiAgICBpbmYgfiB0eXBpY2FsaXR5ICogdHlwaWNhbGl0eV90YXJnZXRfYykKaW5mX3R5cF9tb2RfY29lZnMgPC0gc3VtbWFyeShpbmZfdHlwX21vZCkkY29lZmZpY2llbnRzICU+JQogIGFzX3RpYmJsZSgpICU+JQogIHJvd3dpc2UoKSAlPiUKICB0cmFuc211dGUoCiAgICBwcmVkaWN0b3IgPSAidmFyIiwgZXN0aW1hdGUgPSBmb3JtYShgRXN0aW1hdGVgLCAyKSwKICAgIFNFID0gZm9ybWEoYFN0ZC4gRXJyb3JgLCAyKSwgdCA9IGZvcm1hKGB0IHZhbHVlYCwgMiksCiAgICBwID0gZm9ybXAoYFByKD58dHwpYCkpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGUocHJlZGljdG9yID0gYygiaW50ZXJjZXB0IiwgInR5cGljYWxpdHkgQ09OIC0+IERJUyIsCiAgICAidHlwaWNhbGl0eSByYXRpbmcgTE9XIC0+IEhJR0giLCAiaW50ZXJhY3Rpb24iKSkKCmtuaXRyOjprYWJsZShpbmZfdHlwX21vZF9jb2VmcywgZm9ybWF0ID0gIm1hcmtkb3duIikKCiMgUGxvdAppbmZfdHlwX2RhdCAlPiUKICBnZ3Bsb3QoYWVzKHggPSB0eXBpY2FsaXR5X3RhcmdldCwgeSA9IGluZiwgY29sb3IgPSB0eXBpY2FsaXR5KSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjYpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IFRSVUUsCiAgICBhZXMoZ3JvdXAgPSB0eXBpY2FsaXR5KSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJNb2RlcmF0aW9uIGJ5IHR5cGljYWxpdHkgcmF0aW5nIiwKICAgIHggPSAiVHlwaWNhbGl0eSByYXRpbmciLAogICAgeSA9ICJJbmZlcmVuY2UiLAogICAgY29sb3IgPSAiVHlwaWNhbGl0eSIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiIzJkODVmZiIsICIjMjhlYTk2IikpICsKICB0aGVtZV9jc190YWxrKCkKYGBgCgpUaGUgdGFyZ2V0IHBlcnNvbidzIHBlcmNlaXZlZCB0eXBpY2FsaXR5IGluIHRoZSBkaXNjb25maXJtaW5nIGNvbmRpdGlvbiBgciByZXBvcnRfZGVzYyh0eXBfZGVzYywgMSlgIHdhcyBzaWduaWZpY2FudGx5IGxvd2VyIHRoYW4gaW4gdGhlIGNvbmZpcm1pbmcgY29uZGl0aW9uIGByIHJlcG9ydF9kZXNjKHR5cF9kZXNjLCAyKWAsIGByIHR5cF9yZXBvcnRgLiBUbyBleHBsb3JlIHRoZSBlZmZlY3Qgb2YgdGhlIHR5cGljYWxpdHkgcmF0aW5ncywgd2UgcmFuIGEgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwgd2l0aCB0aGUgaW5mZXJlbmNlcyBhcyB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIGFuZCB0eXBpY2FsaXR5LCB0aGUgdHlwaWNhbGl0eSByYXRpbmcsIGFuZCB0aGUgaW50ZXJhY3Rpb24gYXMgdGhlIHByZWRpY3RvcnMuIFdlIHVzZWQgdHJlYXRtZW50LWNvZGluZyBmb3IgdHlwaWNhbGl0eSBhbmQgY2VudGVyZWQgdGhlIHR5cGljYWxpdHkgcmF0aW5ncy4gVGhlIG92ZXJhbGwgbW9kZWwgd2FzIHNpZ25pZmljYW50LCBGKGByIGZvcm1hKHN1bW1hcnkoaW5mX3R5cF9tb2QpJGZzdGF0aXN0aWNbMl0sIDApYCwgYHIgZm9ybWEoc3VtbWFyeShpbmZfdHlwX21vZCkkZnN0YXRpc3RpY1szXSwgMClgKSA9IGByIGZvcm1hKHN1bW1hcnkoaW5mX3R5cF9tb2QpJGZzdGF0aXN0aWNbMV0sIEZBTFNFKWAsIHAgPSBgciBmb3JtcChwZihzdW1tYXJ5KGluZl90eXBfbW9kKSRmc3RhdGlzdGljWzFdLCBzdW1tYXJ5KGluZl90eXBfbW9kKSRmc3RhdGlzdGljWzJdLCBzdW1tYXJ5KGluZl90eXBfbW9kKSRmc3RhdGlzdGljWzNdLCBsb3dlci50YWlsID0gRkFMU0UpKWAsIFJeMl4gPSBgciBmb3JtYShzdW1tYXJ5KGluZl90eXBfbW9kKSRyLnNxdWFyZWQsIEZBTFNFKWAuIFRoZSBtYWluIGVmZmVjdCBvZiB0eXBpY2FsaXR5IHdhcyBub3Qgc2lnbmlmaWNhbnQsIGIgPSBgciBpbmZfdHlwX21vZF9jb2VmcyRlc3RpbWF0ZVsyXWAsIFNFID0gYHIgaW5mX3R5cF9tb2RfY29lZnMkU0VbMl1gLCB0KGByIGZvcm1hKHN1bW1hcnkoaW5mX3R5cF9tb2QpJGZzdGF0aXN0aWNbM10sIDApYCkgPSBgciBpbmZfdHlwX21vZF9jb2VmcyR0WzJdYCwgYHIgZm9ybXAoaW5mX3R5cF9tb2RfY29lZnMkcFsyXSlgLiBUaGUgbWFpbiBlZmZlY3Qgb2YgcGVyY2VpdmVkIHR5cGljYWxpdHkgd2FzIHNpZ25pZmljYW50LCBiID0gYHIgaW5mX3R5cF9tb2RfY29lZnMkZXN0aW1hdGVbM11gLCBTRSA9IGByIGluZl90eXBfbW9kX2NvZWZzJFNFWzNdYCwgdChgciBmb3JtYShzdW1tYXJ5KGluZl90eXBfbW9kKSRmc3RhdGlzdGljWzNdLCAwKWApID0gYHIgaW5mX3R5cF9tb2RfY29lZnMkdFszXWAsIGByIGZvcm1wKGluZl90eXBfbW9kX2NvZWZzJHBbM10pYCwgaW5kaWNhdGluZyB0aGF0IGluIHRoZSBzdGVyZW90eXBlLWNvbmZpcm1pbmcgY29uZGl0aW9uIGhpZ2hlciBwZXJjZWl2ZWQgdHlwaWNhbGl0eSB3YXMgYXNzb2NpYXRlZCB3aXRoIHN0cm9uZ2VyIGluZmVyZW5jZXMuIEltcG9ydGFudGx5LCB0aGUgaW50ZXJhY3Rpb24gZWZmZWN0IHdhcyBzaWduaWZpY2FudCwgYiA9IGByIGluZl90eXBfbW9kX2NvZWZzJGVzdGltYXRlWzRdYCwgU0UgPSBgciBpbmZfdHlwX21vZF9jb2VmcyRTRVs0XWAsIHQoYHIgZm9ybWEoc3VtbWFyeShpbmZfdHlwX21vZCkkZnN0YXRpc3RpY1szXSwgMClgKSA9IGByIGluZl90eXBfbW9kX2NvZWZzJHRbNF1gLCBgciBmb3JtcChpbmZfdHlwX21vZF9jb2VmcyRwWzRdKWAuIFRoaXMgaW50ZXJhY3Rpb24gaW5kaWNhdGVzIHRoYXQgaW4gdGhlIGRpc2NvbmZpcm1pbmcgY29uZGl0aW9uLCBhIGhpZ2hlciBwZXJjZWl2ZWQgdHlwaWNhbGl0eSBpcyBhc3NvY2lhdGVkIHdpdGggcmVkdWNlZCBpbmZlcmVuY2VzIGNvbXBhcmVkIHRvIHRoZSBjb25maXJtaW5nIGNvbmRpdGlvbi4KCiMjIyBTdGVyZW90eXBlIFByb2JhYmlsaXR5IHsudGFic2V0fQpgYGB7ciB0YXJnZXQgaW5mZXJlbmNlIHBhcnR5IHN0ZXJlb3Byb2IgfiB0eXBpY2FsaXR5LCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0KIyBJbmZlcmVuY2UgZGF0YQppbmZfc3RlcmVvcHJvYl9kYXQgPC0gZGF0ICU+JQogIGZpbHRlcihkaWFnbm9zdGljaXR5X2NvbXBvbmVudCA9PSAiU1RFUkVPUFJPQiIpICU+JQogIGZpbHRlcihjYXRlZ29yeV90eXBlID09ICJQQVJUWSIpICU+JQogIGZpbHRlcihpdGVtX3R5cGUgPT0gInRhcmdldCIpCgojIERlc2NyaXB0aXZlcwppbmZfc3RlcmVvcHJvYl9kZXNjIDwtIGluZl9zdGVyZW9wcm9iX2RhdCAlPiUKICBncm91cF9ieSh0eXBpY2FsaXR5KSAlPiUKICBnZXRfc3VtbWFyeV9zdGF0cyhpbmYsIHR5cGUgPSAibWVhbl9zZCIpICU+JQogIG11dGF0ZSgKICAgIGNpOTVfbG93ID0gbWVhbiAtIDEuOTYgKiBzZCAvIHNxcnQobiksCiAgICBjaTk1X3VwcCA9IG1lYW4gKyAxLjk2ICogc2QgLyBzcXJ0KG4pKQoKIyBJbmRlcGVuZGVudCBzYW1wbGVzIHQtdGVzdAppbmZfc3RlcmVvcHJvYl90IDwtIGluZl9zdGVyZW9wcm9iX2RhdCAlPiUKICB0X3Rlc3QoCiAgICBpbmYgfiB0eXBpY2FsaXR5LAogICAgYWx0ZXJuYXRpdmUgPSAibGVzcyIsCiAgICByZWYuZ3JvdXAgPSAiRElTIikgJT4lCiAgbXV0YXRlKHAgPSBmb3JtcChwLCB0ZXh0ID0gVFJVRSksIGRmID0gZm9ybWEoZGYsIDIpLAogICAgc3RhdGlzdGljID0gZm9ybWEoc3RhdGlzdGljKSkKCiMgQ29oZW5zIGQKaW5mX3N0ZXJlb3Byb2JfZCA8LSBpbmZfc3RlcmVvcHJvYl9kYXQgJT4lCiAgY29oZW5zX2QoaW5mIH4gdHlwaWNhbGl0eSwgcGFpcmVkID0gRkFMU0UpICU+JQogIHB1bGwoZWZmc2l6ZSkgJT4lCiAgZm9ybWEoKQoKIyBQcmludCB0LXRlc3QKaW5mX3N0ZXJlb3Byb2JfcmVwb3J0IDwtIHBhc3RlMCgidCgiLCBpbmZfc3RlcmVvcHJvYl90JGRmLCAiKSA9ICIsCiAgaW5mX3N0ZXJlb3Byb2JfdCRzdGF0aXN0aWMsICIsICIsIGluZl9zdGVyZW9wcm9iX3QkcCwgIiwgZCA9ICIsCiAgaW5mX3N0ZXJlb3Byb2JfZCkKCiMgRVhDTFVERSBPVVRMSUVSUwppbmZfc3RlcmVvcHJvYl9kYXRfZXggPC0gaW5mX3N0ZXJlb3Byb2JfZGF0ICU+JQogIGZpbHRlcihpbmYgPj0gNDApCgojIERlc2NyaXB0aXZlcwppbmZfc3RlcmVvcHJvYl9leF9kZXNjIDwtIGluZl9zdGVyZW9wcm9iX2RhdF9leCAlPiUKICBncm91cF9ieSh0eXBpY2FsaXR5KSAlPiUKICBnZXRfc3VtbWFyeV9zdGF0cyhpbmYsIHR5cGUgPSAibWVhbl9zZCIpICU+JQogIG11dGF0ZSgKICAgIGNpOTVfbG93ID0gbWVhbiAtIDEuOTYgKiBzZCAvIHNxcnQobiksCiAgICBjaTk1X3VwcCA9IG1lYW4gKyAxLjk2ICogc2QgLyBzcXJ0KG4pKQoKIyBJbmRlcGVuZGVudCBzYW1wbGVzIHQtdGVzdAppbmZfc3RlcmVvcHJvYl9leF90IDwtIGluZl9zdGVyZW9wcm9iX2RhdF9leCAlPiUKICB0X3Rlc3QoCiAgICBpbmYgfiB0eXBpY2FsaXR5LAogICAgYWx0ZXJuYXRpdmUgPSAibGVzcyIsCiAgICByZWYuZ3JvdXAgPSAiRElTIikgJT4lCiAgbXV0YXRlKHAgPSBmb3JtcChwLCB0ZXh0ID0gVFJVRSksIGRmID0gZm9ybWEoZGYsIDIpLAogICAgc3RhdGlzdGljID0gZm9ybWEoc3RhdGlzdGljKSkKCiMgQ29oZW5zIGQKaW5mX3N0ZXJlb3Byb2JfZXhfZCA8LSBpbmZfc3RlcmVvcHJvYl9kYXRfZXggJT4lCiAgY29oZW5zX2QoaW5mIH4gdHlwaWNhbGl0eSwgcGFpcmVkID0gRkFMU0UpICU+JQogIHB1bGwoZWZmc2l6ZSkgJT4lCiAgZm9ybWEoKQoKIyBQcmludCB0LXRlc3QKaW5mX3N0ZXJlb3Byb2JfZXhfcmVwb3J0IDwtIHBhc3RlMCgidCgiLCBpbmZfc3RlcmVvcHJvYl9leF90JGRmLCAiKSA9ICIsCiAgaW5mX3N0ZXJlb3Byb2JfZXhfdCRzdGF0aXN0aWMsICIsICIsIGluZl9zdGVyZW9wcm9iX2V4X3QkcCwgIiwgZCA9ICIsCiAgaW5mX3N0ZXJlb3Byb2JfZXhfZCkKCiMgV0lMQ09YT04KIyBPbmUtc2lkZWQgV2lsY294b24gcmFuay1zdW0gdGVzdAppbmZfc3RlcmVvcHJvYl93Y3ggPC0gaW5mX3N0ZXJlb3Byb2JfZGF0ICU+JQogIHdpbGNveF90ZXN0KAogICAgaW5mIH4gdHlwaWNhbGl0eSwKICAgIGFsdGVybmF0aXZlID0gImxlc3MiLAogICAgcmVmLmdyb3VwID0gIkRJUyIpCgojIFdpbGNveG9uIGVmZmVjdCBzaXplIHIKaW5mX3N0ZXJlb3Byb2Jfd2N4X3IgPC0gaW5mX3N0ZXJlb3Byb2JfZGF0ICU+JQogIHdpbGNveF9lZmZzaXplKGluZiB+IHR5cGljYWxpdHksCiAgcmVmLmdyb3VwID0gIkRJUyIpICU+JQogIHB1bGwoZWZmc2l6ZSkKCiMgUHJpbnQgd2lsY294b24gdGVzdAppbmZfc3RlcmVvcHJvYl93Y3hfcmVwb3J0IDwtIHBhc3RlMCgiWiA9ICIsCiAgZm9ybWEoaW5mX3N0ZXJlb3Byb2Jfd2N4X3IgKiBzcXJ0KG5yb3coaW5mX3N0ZXJlb3Byb2JfZGF0KSAvIDIpKSwKICAiLCAiLCBmb3JtcChpbmZfc3RlcmVvcHJvYl93Y3gkcCwgVFJVRSksICIsIHIgPSAiLCBmb3JtYShpbmZfc3RlcmVvcHJvYl93Y3hfcikpCmBgYAoKVG8gdGVzdCB0aGUgZWZmZWN0IG9mIG1hbmlwdWxhdGluZyB0aGUgc3RlcmVvdHlwZSBwcm9iYWJpbGl0eSBjb21wb25lbnQgb2YgZGlhZ25vc3RpY2l0eSBvbiBpbmZlcmVuY2VzIG9mIHBhcnRpc2Fuc2hpcCwgd2UgY29uZHVjdGVkIGFuIGV4cGxvcmF0b3J5IGluZGVwZW5kZW50IHNhbXBsZXMgdC10ZXN0IGNvbXBhcmluZyB0YXJnZXQgaW5mZXJlbmNlcyBvZiBwYXJ0aXNhbnNoaXAgaW4gdGhlIHN0ZXJlb3R5cGUtY29uZmlybWluZyBhbmQgc3RlcmVvdHlwZS1kaXNjb25maXJtaW5nIGNvbmRpdGlvbnMuIFRoZSB0YXJnZXQgaW5mZXJlbmNlcyBpbiB0aGUgZGlzY29uZmlybWluZyBjb25kaXRpb24gYHIgcmVwb3J0X2Rlc2MoaW5mX3N0ZXJlb3Byb2JfZGVzYywgMSlgIHdlcmUgbm90IHNpZ25pZmljYW50bHkgbG93ZXIgdGhhbiBpbiB0aGUgc3RlcmVvdHlwZS1jb25maXJtaW5nIGNvbmRpdGlvbiBgciByZXBvcnRfZGVzYyhpbmZfc3RlcmVvcHJvYl9kZXNjLCAyKWAsIGByIGluZl9zdGVyZW9wcm9iX3JlcG9ydGAuIFRvIGludmVzdGlnYXRlIHdoZXRoZXIgdGhpcyB3YXMgZHVlIHRvIHN0YXRpc3RpY2FsIG91dGxpZXJzLCB3ZSBjb25kdWN0ZWQgYW5vdGhlciBpbmRlcGVuZGVudCBzYW1wbGVzIHQtdGVzdCBleGNsdWRpbmcgcGFydGljaXBhbnRzIHdpdGggdmFsdWVzIGJlbG93IDQwLiBBZnRlciBleGNsdXNpb24sIHRoZSBpbmZlcmVuY2VzIGluIHRoZSBkaXNjb25maXJtaW5nIGNvbmRpdGlvbiBgciByZXBvcnRfZGVzYyhpbmZfc3RlcmVvcHJvYl9leF9kZXNjLCAxKWAgd2VyZSBzdGlsbCBub3Qgc2lnbmlmaWNhbnRseSBsb3dlciB0aGFuIGluIHRoZSBjb25maXJtaW5nIGNvbmRpdGlvbiBgciByZXBvcnRfZGVzYyhpbmZfc3RlcmVvcHJvYl9leF9kZXNjLCAyKWAsIGByIGluZl9zdGVyZW9wcm9iX2V4X3JlcG9ydGAuCgojIyMjIE91dGxpZXIgRGV0ZWN0aW9uCmBgYHtyIHRhcmdldCBpbmZlcmVuY2UgcGFydHkgc3RlcmVvcHJvYiB+IHR5cGljYWxpdHkgb3V0bGllciwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9CmluZl9zdGVyZW9wcm9iX2RhdCAlPiUKICBnZ3Bsb3QoLiwgYWVzKHR5cGljYWxpdHksIGluZikpICsKICBnZW9tX2JveHBsb3Qob3V0bGllci5zaGFwZSA9IE5BKSArCiAgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjIpICsKICBsYWJzKHggPSAiVHlwaWNhbGl0eSIsIHkgPSAiSW5mZXJlbmNlcyIpICsKICB0aGVtZV9jc190YWxrKCkKYGBgCgojIyMjIE11bHRpdmVyc2UgT3V0bGllciBDb3JyZWN0aW9uCmBgYHtyIHRhcmdldCBpbmZlcmVuY2UgcGFydHkgc3RlcmVvcHJvYiB+IHR5cGljYWxpdHkgbXVsdGl2ZXJzZSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9CiMgTG9vcCBvdmVyIGFsbCBjb21iaW5hdGlvbnMgb2YgY3V0b2ZmcyBhbmQgdHJhbnNmb3JtYXRpb25zCm12X3N0ZXJlb3Byb2IgPC0gZGF0YS5mcmFtZSgKICBjdXRvZmYgPSBjKCJub25lIiwgImZpeGVkIDIwIiwgImZpeGVkIDMwIiwgImZpeGVkIDQwIiwKICAgICJNZG4gwrEgMi41IElRUiIsICJNZG4gwrEgMi4wIElRUiIsICJNZG4gwrEgMS41IElRUiIsICJNZG4gwrEgMS4wIElRUiIpLAogIGN1dG9mZl90eXBlID0gYygiZml4ZWQiLCAiZml4ZWQiLCAiZml4ZWQiLCAiZml4ZWQiLAogICAgIk1kbiDCsSBJUVIiLCAiTWRuIMKxIElRUiIsICJNZG4gwrEgSVFSIiwgIk1kbiDCsSBJUVIiKSwKICBjdXRvZmZfdmFsdWUgPSBjKDAsIDIwLCAzMCwgNDAsIDIuNSwgMi4wLCAxLjUsIDEuMCkpCmZvciAoYyBpbiBzZXFfbGVuKG5yb3cobXZfc3RlcmVvcHJvYikpKSB7CiAgaWYgKG12X3N0ZXJlb3Byb2IkY3V0b2ZmX3R5cGVbY10gPT0gImZpeGVkIikgewogICAgbXZfZGF0IDwtIGluZl9zdGVyZW9wcm9iX2RhdCAlPiUKICAgICAgZmlsdGVyKGluZiA+PSBtdl9zdGVyZW9wcm9iJGN1dG9mZl92YWx1ZVtjXSkKICB9IGVsc2UgaWYgKG12X3N0ZXJlb3Byb2IkY3V0b2ZmX3R5cGVbY10gPT0gIk1kbiDCsSBJUVIiKSB7CiAgICBtdl9kYXQgPC0gaW5mX3N0ZXJlb3Byb2JfZGF0ICU+JQogICAgICBncm91cF9ieSh0eXBpY2FsaXR5KSAlPiUKICAgICAgZmlsdGVyKCFpc19vdXRsaWVyKGluZiwgY29lZiA9IG12X3N0ZXJlb3Byb2IkY3V0b2ZmX3ZhbHVlW2NdKSkgJT4lCiAgICAgIHVuZ3JvdXAoKQogIH0KICAjIEluZGVwZW5kZW50IHNhbXBsZXMgdC10ZXN0CiAgbXZfdCA8LSBtdl9kYXQgJT4lCiAgICB0X3Rlc3QoCiAgICAgIGluZiB+IHR5cGljYWxpdHksCiAgICAgIGFsdGVybmF0aXZlID0gImxlc3MiLAogICAgICByZWYuZ3JvdXAgPSAiRElTIikgJT4lCiAgICBtdXRhdGUocCA9IGZvcm1wKHAsIHRleHQgPSBGQUxTRSksIGRmID0gZm9ybWEoZGYsIDIpLAogICAgICBzdGF0aXN0aWMgPSBmb3JtYShzdGF0aXN0aWMpKQoKICAjIENvaGVucyBkCiAgbXZfZCA8LSBtdl9kYXQgJT4lCiAgICBjb2hlbnNfZChpbmYgfiB0eXBpY2FsaXR5KSAlPiUKICAgIHB1bGwoZWZmc2l6ZSkgJT4lCiAgICBmb3JtYSgpCgogICMgU2F2ZSB0ZXN0IHN0YXRpc3RpY3MgZm9yIGgxCiAgbXZfc3RlcmVvcHJvYiRgbiBleGNsdWRlZGBbY10gPC0gbnJvdyhpbmZfc3RlcmVvcHJvYl9kYXQpIC0gbnJvdyhtdl9kYXQpCiAgbXZfc3RlcmVvcHJvYiRkZltjXSA8LSBtdl90JGRmCiAgbXZfc3RlcmVvcHJvYiR0W2NdIDwtIG12X3Qkc3RhdGlzdGljCiAgbXZfc3RlcmVvcHJvYiRwW2NdIDwtIG12X3QkcAogIG12X3N0ZXJlb3Byb2IkZFtjXSA8LSBtdl9kCn0KIyBQcmludCBtdWx0aXZlcnNlIHRhYmxlCmtuaXRyOjprYWJsZShzZWxlY3QobXZfc3RlcmVvcHJvYiwgLWN1dG9mZl90eXBlLCAtIGN1dG9mZl92YWx1ZSksCiAgZm9ybWF0ID0gIm1hcmtkb3duIikKYGBgCgpUbyBpbnZlc3RpZ2F0ZSB0aGUgcm9idXN0bmVzcyBvZiB0aGUgZWZmZWN0IGFjcm9zcyB2YXJpb3VzIG91dGxpZXIgZXhjbHVzaW9uIGNyaXRlcmlhLCB3ZSBjb25kdWN0ZWQgYSBtdWx0aXZlcnNlIGFuYWx5c2lzLiBXZSBhZ2FpbiBwZXJmb3JtZWQgaW5kZXBlbmRlbnQgc2FtcGxlcyB0LXRlc3RzIGFjcm9zcyBzZXZlcmFsIGZpeGVkIGFuZCBkaXN0cmlidXRpb24tYmFzZWQgdGhyZXNob2xkcy4gVGhlIGVmZmVjdCB3YXMgbm9uLXNpZ25pZmljYW50IGFjcm9zcyBhbGwgc2V2ZW4gdGhyZXNob2xkcy4gVGhlc2UgcmVzdWx0cyBzdWdnZXN0IHRoYXQgbWFuaXB1bGF0aW5nIHRoZSBzdGVyZW90eXBlIHByb2JhYmlsaXR5IGhhcyBubyBlZmZlY3Qgb24gaW5mZXJlbmNlcyBvZiBwYXJ0aXNhbnNoaXAuCgojIyMjIFFRLVBsb3QKYGBge3IgdGFyZ2V0IGluZmVyZW5jZSBwYXJ0eSBzdGVyZW9wcm9iIH4gdHlwaWNhbGl0eSBxcSwgbWVzc2FnZSA9IEZBTFNFfQppbmZfc3RlcmVvcHJvYl9kYXQgJT4lCiAgZ2dwbG90KC4sIGFlcyhzYW1wbGUgPSBpbmYpKSArCiAgbGFicyh4ID0gIlRoZW9yZXRpY2FsIHF1YW50aWxlcyIsIHkgPSAiRGF0YSBxdWFudGlsZXMiKSArCiAgc3RhdF9xcShjb2xvciA9ICIjMDAwMDAwIikgKwogIHN0YXRfcXFfbGluZShjb2xvciA9ICIjMDAwMDAwIikgKwogIGZhY2V0X2dyaWQofiB0eXBpY2FsaXR5LCBsYWJlbGxlciA9ICJsYWJlbF92YWx1ZSIpICsKICB0aGVtZV9jc190YWxrKCkKYGBgCgojIyMjIERlc2NyaXB0aXZlcwpgYGB7ciB0YXJnZXQgaW5mZXJlbmNlIHBhcnR5IHN0ZXJlb3Byb2IgfiB0eXBpY2FsaXR5IGRlc2NyaXB0aXZlc30Ka25pdHI6OmthYmxlKGluZl9zdGVyZW9wcm9iX2Rlc2MsIGZvcm1hdCA9ICJtYXJrZG93biIpCmBgYAoKIyMjIyBIaXN0b2dyYW0KYGBge3IgdGFyZ2V0IGluZmVyZW5jZSBwYXJ0eSBzdGVyZW9wcm9iIH4gdHlwaWNhbGl0eSBoaXN0b2dyYW19CmluZl9zdGVyZW9wcm9iX2RhdCAlPiUKICBtdXRhdGUoaW5mX2JpbiA9IGN1dChpbmYsCiAgICBicmVha3MgPSA5LCBsYWJlbHMgPSBGQUxTRSwgaW5jbHVkZS5sb3dlc3QgPSBUUlVFKSkgJT4lCiAgZ2dwbG90KCkgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UocHJlc2VydmUgPSAic2luZ2xlIiksCiAgYWVzKHggPSBpbmZfYmluLCB5ID0gYWZ0ZXJfc3RhdChwcm9wKSwgZmlsbCA9IHR5cGljYWxpdHkpLAogICAgd2lkdGggPSAwLjgpICsKICBsYWJzKHRpdGxlID0gIkhpc3RvZ3JhbW0gb2YgSW5mZXJlbmNlIFNjb3JlcyIsCiAgICB4ID0gIkluZmVyZW5jZSBTY29yZXMiLAogICAgeSA9ICJQcm9wb3J0aW9uIiwgZmlsbCA9ICJUeXBpY2FsaXR5IikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiM4NDlBQjkiLCAiIzQ2NTI2MyIpKSArCiAgdGhlbWVfY3NfdGFsaygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgojIyBJZGVvbG9naWNhbCBDYXRlZ29yaWVzCiMjIyBDb3VudGVyc3RlcmVvdHlwZSBQcm9iYWJpbGl0eSB7LnRhYnNldH0KYGBge3IgdGFyZ2V0IGluZmVyZW5jZSBpZGVvbG9naWNhbCB+IHR5cGljYWxpdHksIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQojIFBSRVJFR0lTVEVSRUQKIyBJbmZlcmVuY2UgZGF0YQppbmZfaWRlb19kYXQgPC0gZGF0ICU+JQogIGZpbHRlcihkaWFnbm9zdGljaXR5X2NvbXBvbmVudCA9PSAiQ09VTlRFUlBST0IiKSAlPiUKICBmaWx0ZXIoY2F0ZWdvcnlfdHlwZSA9PSAiSURFT0xPR0lDQUwiKSAlPiUKICBmaWx0ZXIoaXRlbV90eXBlID09ICJ0YXJnZXQiKQoKIyBEZXNjcmlwdGl2ZXMKaW5mX2lkZW9fZGVzYyA8LSBpbmZfaWRlb19kYXQgJT4lCiAgZ3JvdXBfYnkodHlwaWNhbGl0eSkgJT4lCiAgZ2V0X3N1bW1hcnlfc3RhdHMoaW5mLCB0eXBlID0gIm1lYW5fc2QiKSAlPiUKICBtdXRhdGUoCiAgICBjaTk1X2xvdyA9IG1lYW4gLSAxLjk2ICogc2QgLyBzcXJ0KG4pLAogICAgY2k5NV91cHAgPSBtZWFuICsgMS45NiAqIHNkIC8gc3FydChuKSkKCiMgSW5kZXBlbmRlbnQgc2FtcGxlcyB0LXRlc3QKaW5mX2lkZW9fdCA8LSBpbmZfaWRlb19kYXQgJT4lCiAgdF90ZXN0KAogICAgaW5mIH4gdHlwaWNhbGl0eSwKICAgIGFsdGVybmF0aXZlID0gImxlc3MiLAogICAgcmVmLmdyb3VwID0gIkRJUyIpICU+JQogIG11dGF0ZShwID0gZm9ybXAocCwgdGV4dCA9IFRSVUUpLCBkZiA9IGZvcm1hKGRmLCAyKSwKICAgIHN0YXRpc3RpYyA9IGZvcm1hKHN0YXRpc3RpYykpCgojIENvaGVucyBkCmluZl9pZGVvX2QgPC0gaW5mX2lkZW9fZGF0ICU+JQogIGNvaGVuc19kKGluZiB+IHR5cGljYWxpdHksIHBhaXJlZCA9IEZBTFNFKSAlPiUKICBwdWxsKGVmZnNpemUpICU+JQogIGZvcm1hKCkKCiMgUHJpbnQgdC10ZXN0CmluZl9pZGVvX3JlcG9ydCA8LSBwYXN0ZTAoInQoIiwgaW5mX2lkZW9fdCRkZiwgIikgPSAiLAogIGluZl9pZGVvX3Qkc3RhdGlzdGljLCAiLCAiLCBpbmZfaWRlb190JHAsICIsIGQgPSAiLAogIGluZl9pZGVvX2QpCgojIEVYQ0xVREUgT1VUTElFUlMKaW5mX2lkZW9fZGF0X2V4IDwtIGluZl9pZGVvX2RhdCAlPiUKICBmaWx0ZXIoaW5mID49IDQwKQoKIyBEZXNjcmlwdGl2ZXMKaW5mX2lkZW9fZXhfZGVzYyA8LSBpbmZfaWRlb19kYXRfZXggJT4lCiAgZ3JvdXBfYnkodHlwaWNhbGl0eSkgJT4lCiAgZ2V0X3N1bW1hcnlfc3RhdHMoaW5mLCB0eXBlID0gIm1lYW5fc2QiKSAlPiUKICBtdXRhdGUoCiAgICBjaTk1X2xvdyA9IG1lYW4gLSAxLjk2ICogc2QgLyBzcXJ0KG4pLAogICAgY2k5NV91cHAgPSBtZWFuICsgMS45NiAqIHNkIC8gc3FydChuKSkKCiMgSW5kZXBlbmRlbnQgc2FtcGxlcyB0LXRlc3QKaW5mX2lkZW9fZXhfdCA8LSBpbmZfaWRlb19kYXRfZXggJT4lCiAgdF90ZXN0KAogICAgaW5mIH4gdHlwaWNhbGl0eSwKICAgIGFsdGVybmF0aXZlID0gImxlc3MiLAogICAgcmVmLmdyb3VwID0gIkRJUyIpICU+JQogIG11dGF0ZShwID0gZm9ybXAocCwgdGV4dCA9IFRSVUUpLCBkZiA9IGZvcm1hKGRmLCAyKSwKICAgIHN0YXRpc3RpYyA9IGZvcm1hKHN0YXRpc3RpYykpCgojIENvaGVucyBkCmluZl9pZGVvX2V4X2QgPC0gaW5mX2lkZW9fZGF0X2V4ICU+JQogIGNvaGVuc19kKGluZiB+IHR5cGljYWxpdHksIHBhaXJlZCA9IEZBTFNFKSAlPiUKICBwdWxsKGVmZnNpemUpICU+JQogIGZvcm1hKCkKCiMgUHJpbnQgdC10ZXN0CmluZl9pZGVvX2V4X3JlcG9ydCA8LSBwYXN0ZTAoInQoIiwgaW5mX2lkZW9fZXhfdCRkZiwgIikgPSAiLAogIGluZl9pZGVvX2V4X3Qkc3RhdGlzdGljLCAiLCAiLCBpbmZfaWRlb19leF90JHAsICIsIGQgPSAiLAogIGluZl9pZGVvX2V4X2QpCgojIFdJTENPWE9OCiMgT25lLXNpZGVkIFdpbGNveG9uIHJhbmstc3VtIHRlc3QKaW5mX2lkZW9fd2N4IDwtIGluZl9pZGVvX2RhdCAlPiUKICB3aWxjb3hfdGVzdCgKICAgIGluZiB+IHR5cGljYWxpdHksCiAgICBhbHRlcm5hdGl2ZSA9ICJsZXNzIiwKICAgIHJlZi5ncm91cCA9ICJESVMiKQoKIyBXaWxjb3hvbiBlZmZlY3Qgc2l6ZSByCmluZl9pZGVvX3djeF9yIDwtIGluZl9pZGVvX2RhdCAlPiUKICB3aWxjb3hfZWZmc2l6ZShpbmYgfiB0eXBpY2FsaXR5LAogIHJlZi5ncm91cCA9ICJESVMiKSAlPiUKICBwdWxsKGVmZnNpemUpCgojIFByaW50IHdpbGNveG9uIHRlc3QKaW5mX2lkZW9fd2N4X3JlcG9ydCA8LSBwYXN0ZTAoIlogPSAiLAogIGZvcm1hKGluZl9pZGVvX3djeF9yICogc3FydChucm93KGluZl9pZGVvX2RhdCkgLyAyKSksCiAgIiwgIiwgZm9ybXAoaW5mX2lkZW9fd2N4JHAsIFRSVUUpLCAiLCByID0gIiwgZm9ybWEoaW5mX2lkZW9fd2N4X3IpKQpgYGAKClRvIHRlc3Qgb3VyIGh5cG90aGVzaXMgaW4gdGhlIGlkZW9sb2dpY2FsIGNhdGVnb3J5IGNvbmRpdGlvbiwgd2UgY29uZHVjdGVkIGEgcHJlcmVnaXN0ZXJlZCBpbmRlcGVuZGVudCBzYW1wbGVzIHQtdGVzdCBjb21wYXJpbmcgdGFyZ2V0IGluZmVyZW5jZXMgb2YgaWRlb2xvZ2ljYWwgY2F0ZWdvcmllcyBpbiB0aGUgc3RlcmVvdHlwZS1jb25maXJtaW5nIGFuZCBzdGVyZW90eXBlLWRpc2NvbmZpcm1pbmcgY29uZGl0aW9ucy4gVGhlIHRhcmdldCBpbmZlcmVuY2VzIGluIHRoZSBkaXNjb25maXJtaW5nIGNvbmRpdGlvbiBgciByZXBvcnRfZGVzYyhpbmZfaWRlb19kZXNjLCAxKWAgd2VyZSBub3Qgc2lnbmlmaWNhbnRseSBsb3dlciB0aGFuIGluIHRoZSBzdGVyZW90eXBlLWNvbmZpcm1pbmcgY29uZGl0aW9uIGByIHJlcG9ydF9kZXNjKGluZl9pZGVvX2Rlc2MsIDIpYCwgYHIgaW5mX2lkZW9fcmVwb3J0YC4gVG8gaW52ZXN0aWdhdGUgd2hldGhlciB0aGlzIHdhcyBkdWUgdG8gc3RhdGlzdGljYWwgb3V0bGllcnMsIHdlIGNvbmR1Y3RlZCBhbm90aGVyIGluZGVwZW5kZW50IHNhbXBsZXMgdC10ZXN0IGV4Y2x1ZGluZyBwYXJ0aWNpcGFudHMgd2l0aCB2YWx1ZXMgYmVsb3cgNDAuIEFmdGVyIGV4Y2x1c2lvbiwgdGhlIGluZmVyZW5jZXMgaW4gdGhlIGRpc2NvbmZpcm1pbmcgY29uZGl0aW9uIGByIHJlcG9ydF9kZXNjKGluZl9pZGVvX2V4X2Rlc2MsIDEpYCB3ZXJlIHNpZ25pZmljYW50bHkgbG93ZXIgdGhhbiBpbiB0aGUgY29uZmlybWluZyBjb25kaXRpb24gYHIgcmVwb3J0X2Rlc2MoaW5mX2lkZW9fZXhfZGVzYywgMilgLCBgciBpbmZfaWRlb19leF9yZXBvcnRgLgoKIyMjIyBPdXRsaWVyIERldGVjdGlvbgpgYGB7ciB0YXJnZXQgaW5mZXJlbmNlIGlkZW9sb2dpY2FsIH4gdHlwaWNhbGl0eSBvdXRsaWVyLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0KaW5mX2lkZW9fZGF0ICU+JQogIGdncGxvdCguLCBhZXModHlwaWNhbGl0eSwgaW5mKSkgKwogIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEpICsKICBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMikgKwogIGxhYnMoeCA9ICJUeXBpY2FsaXR5IiwgeSA9ICJJbmZlcmVuY2VzIikgKwogIHRoZW1lX2NzX3RhbGsoKQpgYGAKCiMjIyMgTXVsdGl2ZXJzZSBPdXRsaWVyIENvcnJlY3Rpb24KYGBge3IgdGFyZ2V0IGluZmVyZW5jZSBpZGVvbG9naWNhbCB+IHR5cGljYWxpdHkgbXVsdGl2ZXJzZSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9CiMgTG9vcCBvdmVyIGFsbCBjb21iaW5hdGlvbnMgb2YgY3V0b2ZmcyBhbmQgdHJhbnNmb3JtYXRpb25zCm12X2lkZW8gPC0gZGF0YS5mcmFtZSgKICBjdXRvZmYgPSBjKCJub25lIiwgImZpeGVkIDIwIiwgImZpeGVkIDMwIiwgImZpeGVkIDQwIiwKICAgICJNZG4gwrEgMi41IElRUiIsICJNZG4gwrEgMi4wIElRUiIsICJNZG4gwrEgMS41IElRUiIsICJNZG4gwrEgMS4wIElRUiIpLAogIGN1dG9mZl90eXBlID0gYygiZml4ZWQiLCAiZml4ZWQiLCAiZml4ZWQiLCAiZml4ZWQiLAogICAgIk1kbiDCsSBJUVIiLCAiTWRuIMKxIElRUiIsICJNZG4gwrEgSVFSIiwgIk1kbiDCsSBJUVIiKSwKICBjdXRvZmZfdmFsdWUgPSBjKDAsIDIwLCAzMCwgNDAsIDIuNSwgMi4wLCAxLjUsIDEuMCkpCmZvciAoYyBpbiBzZXFfbGVuKG5yb3cobXZfaWRlbykpKSB7CiAgaWYgKG12X2lkZW8kY3V0b2ZmX3R5cGVbY10gPT0gImZpeGVkIikgewogICAgbXZfZGF0IDwtIGluZl9pZGVvX2RhdCAlPiUKICAgICAgZmlsdGVyKGluZiA+PSBtdl9pZGVvJGN1dG9mZl92YWx1ZVtjXSkKICB9IGVsc2UgaWYgKG12X2lkZW8kY3V0b2ZmX3R5cGVbY10gPT0gIk1kbiDCsSBJUVIiKSB7CiAgICBtdl9kYXQgPC0gaW5mX2lkZW9fZGF0ICU+JQogICAgICBncm91cF9ieSh0eXBpY2FsaXR5KSAlPiUKICAgICAgZmlsdGVyKCFpc19vdXRsaWVyKGluZiwgY29lZiA9IG12X2lkZW8kY3V0b2ZmX3ZhbHVlW2NdKSkgJT4lCiAgICAgIHVuZ3JvdXAoKQogIH0KICAjIEluZGVwZW5kZW50IHNhbXBsZXMgdC10ZXN0CiAgbXZfdCA8LSBtdl9kYXQgJT4lCiAgICB0X3Rlc3QoCiAgICAgIGluZiB+IHR5cGljYWxpdHksCiAgICAgIGFsdGVybmF0aXZlID0gImxlc3MiLAogICAgICByZWYuZ3JvdXAgPSAiRElTIikgJT4lCiAgICBtdXRhdGUocCA9IGZvcm1wKHAsIHRleHQgPSBGQUxTRSksIGRmID0gZm9ybWEoZGYsIDIpLAogICAgICBzdGF0aXN0aWMgPSBmb3JtYShzdGF0aXN0aWMpKQoKICAjIENvaGVucyBkCiAgbXZfZCA8LSBtdl9kYXQgJT4lCiAgICBjb2hlbnNfZChpbmYgfiB0eXBpY2FsaXR5KSAlPiUKICAgIHB1bGwoZWZmc2l6ZSkgJT4lCiAgICBmb3JtYSgpCgogICMgU2F2ZSB0ZXN0IHN0YXRpc3RpY3MgZm9yIGgxCiAgbXZfaWRlbyRgbiBleGNsdWRlZGBbY10gPC0gbnJvdyhpbmZfaWRlb19kYXQpIC0gbnJvdyhtdl9kYXQpCiAgbXZfaWRlbyRkZltjXSA8LSBtdl90JGRmCiAgbXZfaWRlbyR0W2NdIDwtIG12X3Qkc3RhdGlzdGljCiAgbXZfaWRlbyRwW2NdIDwtIG12X3QkcAogIG12X2lkZW8kZFtjXSA8LSBtdl9kCn0KIyBQcmludCBtdWx0aXZlcnNlIHRhYmxlCmtuaXRyOjprYWJsZShzZWxlY3QobXZfaWRlbywgLWN1dG9mZl90eXBlLCAtIGN1dG9mZl92YWx1ZSksIGZvcm1hdCA9ICJtYXJrZG93biIpCmBgYAoKVG8gaW52ZXN0aWdhdGUgdGhlIHJvYnVzdG5lc3Mgb2YgdGhlIGVmZmVjdCBhY3Jvc3MgdmFyaW91cyBvdXRsaWVyIGV4Y2x1c2lvbiBjcml0ZXJpYSwgd2UgY29uZHVjdGVkIGEgbXVsdGl2ZXJzZSBhbmFseXNpcy4gV2UgYWdhaW4gcGVyZm9ybWVkIGluZGVwZW5kZW50IHNhbXBsZXMgdC10ZXN0cyBhY3Jvc3Mgc2V2ZXJhbCBmaXhlZCBhbmQgZGlzdHJpYnV0aW9uLWJhc2VkIHRocmVzaG9sZHMuIFRoZSBlZmZlY3Qgd2FzIHNpZ25pZmljYW50IGFjcm9zcyBhbGwgc2V2ZW4gdGhyZXNob2xkcy4gVGhlc2UgcmVzdWx0cyBhZ2FpbiBzdWdnZXN0IHRoYXQgdGhlIGVmZmVjdCBtYXkgaGF2ZSBiZWVuIG9ic2N1cmVkIGR1ZSB0byBtb2RlbCBvdXRsaWVycy4KCiMjIyMgUVEtUGxvdApgYGB7ciB0YXJnZXQgaW5mZXJlbmNlIGlkZW9sb2dpY2FsIH4gdHlwaWNhbGl0eSBxcSwgbWVzc2FnZSA9IEZBTFNFfQppbmZfaWRlb19kYXRfZXggJT4lCiAgZ2dwbG90KC4sIGFlcyhzYW1wbGUgPSBpbmYpKSArCiAgbGFicyh4ID0gIlRoZW9yZXRpY2FsIHF1YW50aWxlcyIsIHkgPSAiRGF0YSBxdWFudGlsZXMiKSArCiAgc3RhdF9xcShjb2xvciA9ICIjMDAwMDAwIikgKwogIHN0YXRfcXFfbGluZShjb2xvciA9ICIjMDAwMDAwIikgKwogIGZhY2V0X2dyaWQofiB0eXBpY2FsaXR5LCBsYWJlbGxlciA9ICJsYWJlbF92YWx1ZSIpICsKICB0aGVtZV9jc190YWxrKCkKYGBgCgojIyMjIERlc2NyaXB0aXZlcwpgYGB7ciB0YXJnZXQgaW5mZXJlbmNlIGlkZW9sb2dpY2FsIH4gdGltZSAqIHR5cGljYWxpdHkgZGVzY3JpcHRpdmVzfQprbml0cjo6a2FibGUoaW5mX2lkZW9fZGVzYywgZm9ybWF0ID0gIm1hcmtkb3duIikKYGBgCgojIyMjIEhpc3RvZ3JhbQpgYGB7ciB0YXJnZXQgaW5mZXJlbmNlIGlkZW9sb2dpY2FsIH4gdGltZSAqIHR5cGljYWxpdHkgaGlzdG9ncmFtfQppbmZfaWRlb19kYXRfZXggJT4lCiAgbXV0YXRlKGluZl9iaW4gPSBjdXQoaW5mLAogICAgYnJlYWtzID0gOSwgbGFiZWxzID0gRkFMU0UsIGluY2x1ZGUubG93ZXN0ID0gVFJVRSkpICU+JQogIGdncGxvdCgpICsKICBnZW9tX2Jhcihwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHByZXNlcnZlID0gInNpbmdsZSIpLAogIGFlcyh4ID0gaW5mX2JpbiwgeSA9IGFmdGVyX3N0YXQocHJvcCksIGZpbGwgPSB0eXBpY2FsaXR5KSwKICAgIHdpZHRoID0gMC44KSArCiAgbGFicyh0aXRsZSA9ICJIaXN0b2dyYW1tIG9mIEluZmVyZW5jZSBTY29yZXMiLAogICAgeCA9ICJJbmZlcmVuY2UgU2NvcmVzIiwKICAgIHkgPSAiUHJvcG9ydGlvbiIsIGZpbGwgPSAiVHlwaWNhbGl0eSIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjODQ5QUI5IiwgIiM0NjUyNjMiKSkgKwogIHRoZW1lX2NzX3RhbGsoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKIyMjIyBNb2RlcmF0aW9uIGJ5IHBhcnRpY2lwYW50IGlkZW9sb2d5CmBgYHtyIHRhcmdldCBpbmZlcmVuY2UgaWRlb2xvZ2ljYWwgfiB0eXBpY2FsaXR5ICogaWRlb2xvZ3l9CiMgUHJlcGFyZSBkYXRhCmluZl9pZGVvX2lkZW9fZGF0IDwtIGluZl9pZGVvX2RhdF9leCAlPiUKICBtdXRhdGUoaWRlb19jYXQgPSBjYXNlX3doZW4oCiAgICBwb2xpdGljYWxfaWRlb2xvZ3kgPCAzNSB+ICJDT04iLAogICAgcG9saXRpY2FsX2lkZW9sb2d5ID4gNjUgfiAiTElCIiwKICAgIC5kZWZhdWx0ID0gIk1PRCIKICApKQoKIyBEZXNjcmlwdGl2ZXMKaW5mX2lkZW9faWRlb19kZXNjIDwtIGluZl9pZGVvX2lkZW9fZGF0ICU+JQogIGdyb3VwX2J5KGlkZW9fY2F0LCB0eXBpY2FsaXR5KSAlPiUKICBnZXRfc3VtbWFyeV9zdGF0cyhpbmYsIHR5cGUgPSAibWVhbl9zZCIpICU+JQogIG11dGF0ZSgKICAgIGNpOTVfbG93ID0gbWVhbiAtIDEuOTYgKiBzZCAvIHNxcnQobiksCiAgICBjaTk1X3VwcCA9IG1lYW4gKyAxLjk2ICogc2QgLyBzcXJ0KG4pKQoKIyBSdW4gQU5PVkEKaW5mX2lkZW9faWRlb19tb2QgPC0gaW5mX2lkZW9faWRlb19kYXQgJT4lCiAgYW5vdmFfdGVzdChkdiA9IGluZiwKICAgIGVmZmVjdC5zaXplID0gInBlcyIsCiAgICBiZXR3ZWVuID0gYyhpZGVvX2NhdCwgdHlwaWNhbGl0eSkpICU+JQogIGFzX3RpYmJsZSgpICU+JQogIHJvd3dpc2UoKSAlPiUKICBtdXRhdGUoRiA9IGZvcm1hKGBGYCwgMiksIHAgPSBmb3JtcChwKSwgcGVzID0gZm9ybWEocGVzLCAzLCBGQUxTRSkpCgprbml0cjo6a2FibGUoaW5mX2lkZW9faWRlb19tb2QsIGZvcm1hdCA9ICJtYXJrZG93biIpCmBgYAoKSXQgbWF5IGJlIHBvc3NpYmxlIHRoYXQgdGhlIGVmZmVjdCBvZiBkaWFnbm9zdGljaXR5IG9uIHRoZSBpbmZlcmVuY2VzIGRlcGVuZHMgb24gdGhlIHBhcnRpY2lwYW50J3MgaWRlb2xvZ2ljYWwgY2F0ZWdvcnkuIFRvIHRlc3QgdGhpcywgd2UgY2F0ZWdvcml6ZWQgcGFydGljaXBhbnRzIHdpdGggYW4gaWRlb2xvZ3kgc2NvcmUgb2YgYmVsb3cgMzUgYXMgY29uc2VydmF0aXZlcywgdGhvc2Ugd2l0aCBhIHNjb3JlIGhpZ2hlciB0aGFuIDY1IGFzIGxpYmVyYWxzLCBhbmQgdGhvc2UgaW4gYmV0d2VlbiBhcyBtb2RlcmF0ZXMgYW5kIHRoZW4gY29uZHVjdGVkIGEgdHdvLXdheSBiZXR3ZWVuLXN1YmplY3RzIEFOT1ZBIHdpdGggdGhlIHRhcmdldCBpbmZlcmVuY2UgYXMgdGhlIGRlcGVuZGVudCB2YXJpYWJsZSBhbmQgdGhlIHBhcnRpY2lwYW50cycgaWRlb2xvZ2ljYWwgaWRlbnRpZmljYXRpb24gYW5kIHR5cGljYWxpdHkgYXMgYmV0d2Vlbi1zdWJqZWN0cyBmYWN0b3JzLiBXZSBmb3VuZCBhIHNpZ25pZmljYW50IGVmZmVjdCBvZiBpZGVvbG9naWNhbCBjYXRlZ29yeSwgd2hpY2ggd2FzIGxpa2VseSBkcml2ZW4gYnkgbG93ZXIgaW5mZXJlbmNlIHNjb3JlcyBvZiBpZGVvbG9naWNhbCBtb2RlcmF0ZXMuIE1vcmVvdmVyLCB3ZSBmb3VuZCBhIHNpZ25pZmljYW50IGVmZmVjdCBvZiB0eXBpY2FsaXR5LgoKIyMjIyBNb2RlcmF0aW9uIGJ5IGlkZW9sb2dpY2FsIGZpdApgYGB7ciB0YXJnZXQgaW5mZXJlbmNlIGlkZW9sb2dpY2FsIH4gdHlwaWNhbGl0eSAqIGlkZW9sb2dpY2FsIGZpdH0KIyBQcmVwYXJlIGRhdGEKaW5mX2lkZW9fZml0X2RhdCA8LSBpbmZfaWRlb19pZGVvX2RhdCAlPiUKICAjIFNlbGVjdCBwYXJ0aWNpcGFudHMgd2hvIGlkZW50aWZ5IGFzIGxpYmVyYWwgb3IgY29uc2VydmF0aXZlCiAgZmlsdGVyKGlkZW9fY2F0ICVpbiUgYygiQ09OIiwgIkxJQiIpKSAlPiUKICAjIENyZWF0ZSBpZGVvbG9naWNhbCBmaXQgdmFyaWFibGUKICBtdXRhdGUoaWRlb19maXQgPSBhcy5mYWN0b3IoaWZlbHNlKAogICAgaWRlb19jYXQgPT0gdGFyZ2V0X2NhdGVnb3J5X2xhYmVsLAogICAgInNhbWUiLCAiZGlmZmVyZW50IikpKQoKIyBEZXNjcmlwdGl2ZXMKaW5mX2lkZW9fZml0X2Rlc2MgPC0gaW5mX2lkZW9fZml0X2RhdCAlPiUKICBncm91cF9ieShpZGVvX2ZpdCwgdHlwaWNhbGl0eSkgJT4lCiAgZ2V0X3N1bW1hcnlfc3RhdHMoaW5mLCB0eXBlID0gIm1lYW5fc2QiKSAlPiUKICBtdXRhdGUoCiAgICBjaTk1X2xvdyA9IG1lYW4gLSAxLjk2ICogc2QgLyBzcXJ0KG4pLAogICAgY2k5NV91cHAgPSBtZWFuICsgMS45NiAqIHNkIC8gc3FydChuKSkKCiMgUnVuIEFOT1ZBCmluZl9pZGVvX2ZpdF9tb2QgPC0gaW5mX2lkZW9fZml0X2RhdCAlPiUKICBhbm92YV90ZXN0KGR2ID0gaW5mLAogICAgZWZmZWN0LnNpemUgPSAicGVzIiwKICAgIGJldHdlZW4gPSBjKGlkZW9fZml0LCB0eXBpY2FsaXR5KSkgJT4lCiAgYXNfdGliYmxlKCkgJT4lCiAgcm93d2lzZSgpICU+JQogIG11dGF0ZShGID0gZm9ybWEoYEZgLCAyKSwgcCA9IGZvcm1wKHApLCBwZXMgPSBmb3JtYShwZXMsIDMsIEZBTFNFKSkKCmtuaXRyOjprYWJsZShpbmZfaWRlb19maXRfbW9kLCBmb3JtYXQgPSAibWFya2Rvd24iKQpgYGAKCkl0IG1heSBiZSBwb3NzaWJsZSB0aGF0IHRoZSBlZmZlY3Qgb2YgZGlhZ25vc3RpY2l0eSBvbiB0aGUgaW5mZXJlbmNlcyBkZXBlbmRzIG9uIHRoZSBmaXQgYmV0d2VlbiB0aGUgcGFydGljaXBhbnQncyBpZGVvbG9naWNhbCBjYXRlZ29yeSBhbmQgdGhlIHRhcmdldCdzIGNhdGVnb3J5LiBXZSB0aGVyZWZvcmUgcmFuIGFuIGV4cGxvcmF0b3J5IGFuYWx5c2lzIGV4YW1pbmluZyB0aGUgcm9sZSBvZiBpZGVvbG9naWNhbCBmaXQgKGkuZS4sIHdoZXRoZXIgcGFydGljaXBhbnQgYW5kIHRhcmdldCBiZWxvbmcgdG8gdGhlIHNhbWUgY2F0ZWdvcnkgb3IgYSBkaWZmZXJlbnQgb25lKS4gV2UgZXhjbHVkZWQgcGFydGljaXBhbnRzIGNsYXNzaWZpZWQgYXMgbW9kZXJhdGVzIGFuZCBjb25kdWN0ZWQgYSB0d28td2F5IGJldHdlZW4tc3ViamVjdHMgQU5PVkEgd2l0aCB0aGUgdGFyZ2V0IGluZmVyZW5jZSBhcyB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIGFuZCBpZGVvbG9naWNhbCBmaXQgYW5kIHR5cGljYWxpdHkgYXMgYmV0d2Vlbi1zdWJqZWN0cyBmYWN0b3JzLiBOb25lIG9mIHRoZSBlZmZlY3RzIHdlcmUgc2lnbmlmaWNhbnQuCgojIyMjIE1vZGVyYXRpb24gYnkgcG9saXRpY2FsIGlzc3VlCmBgYHtyIHRhcmdldCBpbmZlcmVuY2UgaWRlb2xvZ2ljYWwgfiB0eXBpY2FsaXR5ICogaXNzdWV9CiMgRGVzY3JpcHRpdmVzCmluZl9pZGVvX2lzc3VlX2Rlc2MgPC0gaW5mX2lkZW9fZGF0X2V4ICU+JQogIGdyb3VwX2J5KGlzc3VlLCB0eXBpY2FsaXR5KSAlPiUKICBnZXRfc3VtbWFyeV9zdGF0cyhpbmYsIHR5cGUgPSAibWVhbl9zZCIpICU+JQogIG11dGF0ZSgKICAgIGNpOTVfbG93ID0gbWVhbiAtIDEuOTYgKiBzZCAvIHNxcnQobiksCiAgICBjaTk1X3VwcCA9IG1lYW4gKyAxLjk2ICogc2QgLyBzcXJ0KG4pKQoKIyBSdW4gQU5PVkEKaW5mX2lkZW9faXNzdWVfbW9kIDwtIGluZl9pZGVvX2RhdF9leCAlPiUKICBhbm92YV90ZXN0KGR2ID0gaW5mLAogICAgZWZmZWN0LnNpemUgPSAicGVzIiwKICAgIGJldHdlZW4gPSBjKGlzc3VlLCB0eXBpY2FsaXR5KSkgJT4lCiAgYXNfdGliYmxlKCkgJT4lCiAgcm93d2lzZSgpICU+JQogIG11dGF0ZShGID0gZm9ybWEoYEZgLCAyKSwgcCA9IGZvcm1wKHApLCBwZXMgPSBmb3JtYShwZXMsIDMsIEZBTFNFKSkKCmtuaXRyOjprYWJsZShpbmZfaWRlb19pc3N1ZV9tb2QsIGZvcm1hdCA9ICJtYXJrZG93biIpCmBgYAoKV2UgcmFuIGFub3RoZXIgZXhwbG9yYXRvcnkgYW5hbHlzaXMgdG8gdGVzdCB3aGV0aGVyIHRoZSBlZmZlY3Qgb2YgZGlhZ25vc3RpY2l0eSBvbiB0aGUgaW5mZXJlbmNlcyB3YXMgbW9kZXJhdGVkIGJ5IHRoZSBpc3N1ZSBmb3Igd2hpY2ggZGlhZ25vc3RpY2l0eSB3YXMgbWFuaXB1bGF0ZWQuIFdlIGNvbmR1Y3RlZCBhIHR3by13YXkgYmV0d2Vlbi1zdWJqZWN0cyBBTk9WQSB3aXRoIHRoZSB0YXJnZXQgaW5mZXJlbmNlIGFzIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUgYW5kIGlzc3VlIGFuZCB0eXBpY2FsaXR5IGFzIGJldHdlZW4tc3ViamVjdHMgZmFjdG9ycy4gV2UgZm91bmQgYSBzaWduaWZpY2FudCBlZmZlY3QgZm9yIGlzc3VlIHRoYXQgd2FzIGxpa2VseSBkcml2ZW4gYnkgbG93ZXIgaW5mZXJlbmNlcyBpbiB0aGUgYWZmaXJtYXRpdmUgYWN0aW9uIGNvbmRpdGlvbi4gTW9yZW92ZXIsIHdlIGZvdW5kIGEgc2lnbmlmaWNhbnQgZWZmZWN0IG9mIHR5cGljYWxpdHkuIFRoZSBpbnRlcmFjdGlvbiB3YXMgbm90IHNpZ25pZmljYW50LgoKIyMjIyBNb2RlcmF0aW9uIGJ5IHR5cGljYWxpdHkgcmF0aW5nCmBgYHtyIHRhcmdldCBpbmZlcmVuY2UgaWRlb2xvZ2ljYWwgfiB0eXBpY2FsaXR5ICogdHlwaWNhbGl0eV9yYXRpbmcsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQppbmZfaWRlb190eXBfZGF0IDwtIGluZl9pZGVvX2RhdF9leCAlPiUKICBncm91cF9ieSh0eXBpY2FsaXR5KSAlPiUKICBtdXRhdGUodHlwaWNhbGl0eV9iaW4gPSBudGlsZSh0eXBpY2FsaXR5X3RhcmdldCwgMikpICU+JQogIG11dGF0ZSh0eXBpY2FsaXR5X2JpbiA9IGZhY3Rvcih0eXBpY2FsaXR5X2JpbiwgbGFiZWxzID0gYygibG93IiwgImhpZ2giKSkpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGUodHlwaWNhbGl0eV90YXJnZXRfYyA9IHR5cGljYWxpdHlfdGFyZ2V0IC0gbWVhbih0eXBpY2FsaXR5X3RhcmdldCkpCgojIERWOiBUeXBpY2FsaXR5CiMgRGVzY3JpcHRpdmVzCnR5cF9pZGVvX2Rlc2MgPC0gaW5mX2lkZW9fdHlwX2RhdCAlPiUKICBncm91cF9ieSh0eXBpY2FsaXR5KSAlPiUKICBnZXRfc3VtbWFyeV9zdGF0cyh0eXBpY2FsaXR5X3RhcmdldCwgdHlwZSA9ICJtZWFuX3NkIikgJT4lCiAgbXV0YXRlKAogICAgY2k5NV9sb3cgPSBtZWFuIC0gMS45NiAqIHNkIC8gc3FydChuKSwKICAgIGNpOTVfdXBwID0gbWVhbiArIDEuOTYgKiBzZCAvIHNxcnQobikpCgojIEluZGVwZW5kZW50IHNhbXBsZXMgdC10ZXN0CnR5cF9pZGVvX3QgPC0gaW5mX2lkZW9fdHlwX2RhdCAlPiUKICB0X3Rlc3QoCiAgICB0eXBpY2FsaXR5X3RhcmdldCB+IHR5cGljYWxpdHksCiAgICBhbHRlcm5hdGl2ZSA9ICJsZXNzIiwKICAgIHJlZi5ncm91cCA9ICJESVMiKSAlPiUKICBtdXRhdGUocCA9IGZvcm1wKHAsIHRleHQgPSBUUlVFKSwgZGYgPSBmb3JtYShkZiwgMiksCiAgICBzdGF0aXN0aWMgPSBmb3JtYShzdGF0aXN0aWMpKQoKIyBDb2hlbnMgZAp0eXBfaWRlb19kIDwtIGluZl9pZGVvX3R5cF9kYXQgJT4lCiAgY29oZW5zX2QodHlwaWNhbGl0eV90YXJnZXQgfiB0eXBpY2FsaXR5LCBwYWlyZWQgPSBGQUxTRSkgJT4lCiAgcHVsbChlZmZzaXplKSAlPiUKICBmb3JtYSgpCgojIFByaW50IHQtdGVzdAp0eXBfaWRlb19yZXBvcnQgPC0gcGFzdGUwKCJ0KCIsIHR5cF9pZGVvX3QkZGYsICIpID0gIiwKICB0eXBfaWRlb190JHN0YXRpc3RpYywgIiwgIiwgdHlwX2lkZW9fdCRwLCAiLCBkID0gIiwKICB0eXBfaWRlb19kKQoKIyBEVjogSW5mZXJlbmNlcwppbmZfaWRlb190eXBfZGVzYyA8LSBpbmZfaWRlb190eXBfZGF0ICU+JQogIGdyb3VwX2J5KHR5cGljYWxpdHlfYmluLCB0eXBpY2FsaXR5KSAlPiUKICBnZXRfc3VtbWFyeV9zdGF0cyhpbmYsIHR5cGUgPSAibWVhbl9zZCIpICU+JQogIG11dGF0ZSgKICAgIGNpOTVfbG93ID0gbWVhbiAtIDEuOTYgKiBzZCAvIHNxcnQobiksCiAgICBjaTk1X3VwcCA9IG1lYW4gKyAxLjk2ICogc2QgLyBzcXJ0KG4pKQoKa25pdHI6OmthYmxlKGluZl9pZGVvX3R5cF9kZXNjLCBmb3JtYXQgPSAibWFya2Rvd24iKQoKIyBSdW4gcmVncmVzc2lvbgpjb250cmFzdHMoaW5mX2lkZW9fdHlwX2RhdCR0eXBpY2FsaXR5KSA8LSBjKDEsIDApCmluZl9pZGVvX3R5cF9tb2QgPC0gbG0oCiAgICBkYXRhID0gaW5mX2lkZW9fdHlwX2RhdCwKICAgIGluZiB+IHR5cGljYWxpdHkgKiB0eXBpY2FsaXR5X3RhcmdldCkKaW5mX2lkZW9fdHlwX21vZF9jb2VmcyA8LSBzdW1tYXJ5KGluZl9pZGVvX3R5cF9tb2QpJGNvZWZmaWNpZW50cyAlPiUKICBhc190aWJibGUoKSAlPiUKICByb3d3aXNlKCkgJT4lCiAgdHJhbnNtdXRlKAogICAgcHJlZGljdG9yID0gInZhciIsIGVzdGltYXRlID0gZm9ybWEoYEVzdGltYXRlYCwgMiksCiAgICBTRSA9IGZvcm1hKGBTdGQuIEVycm9yYCwgMiksIHQgPSBmb3JtYShgdCB2YWx1ZWAsIDIpLAogICAgcCA9IGZvcm1wKGBQcig+fHR8KWApKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKHByZWRpY3RvciA9IGMoImludGVyY2VwdCIsICJ0eXBpY2FsaXR5IENPTiAtPiBESVMiLAogICAgInR5cGljYWxpdHkgcmF0aW5nIExPVyAtPiBISUdIIiwgImludGVyYWN0aW9uIikpCgojIFBsb3QKaW5mX2lkZW9fdHlwX2RhdCAlPiUKICBnZ3Bsb3QoYWVzKHggPSB0eXBpY2FsaXR5X3RhcmdldCwgeSA9IGluZiwgY29sb3IgPSB0eXBpY2FsaXR5KSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjYpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IFRSVUUsCiAgICBhZXMoZ3JvdXAgPSB0eXBpY2FsaXR5KSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJNb2RlcmF0aW9uIGJ5IHR5cGljYWxpdHkgcmF0aW5nIiwKICAgIHggPSAiVHlwaWNhbGl0eSByYXRpbmciLAogICAgeSA9ICJJbmZlcmVuY2UiLAogICAgY29sb3IgPSAiVHlwaWNhbGl0eSIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiIzJkODVmZiIsICIjMjhlYTk2IikpICsKICB0aGVtZV9jc190YWxrKCkKYGBgCgpUaGUgdGFyZ2V0IHBlcnNvbiBpbiB0aGUgZGlzY29uZmlybWluZyBjb25kaXRpb24gd2FzIHJhdGVkIGFzIHNpZ25pZmljYW50bHkgbGVzcyB0eXBpY2FsIHRoYW4gaW4gdGhlIGNvbmZpcm1pbmcgY29uZGl0aW9uLCBgciB0eXBfaWRlb19yZXBvcnRgLiBUbyBleHBsb3JlIHRoZSBlZmZlY3Qgb2YgdGhlIHR5cGljYWxpdHkgcmF0aW5ncywgd2UgcmFuIGEgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwgd2l0aCB0aGUgaW5mZXJlbmNlcyBhcyB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIGFuZCB0eXBpY2FsaXR5LCB0aGUgdHlwaWNhbGl0eSByYXRpbmcsIGFuZCB0aGUgaW50ZXJhY3Rpb24gYXMgdGhlIHByZWRpY3RvcnMuIFdlIHVzZWQgdHJlYXRtZW50LWNvZGluZyBmb3IgdHlwaWNhbGl0eSBhbmQgY2VudGVyZWQgdGhlIHR5cGljYWxpdHkgcmF0aW5ncy4gVGhlIG92ZXJhbGwgbW9kZWwgd2FzIG5vdCBzaWduaWZpY2FudCwgRihgciBmb3JtYShzdW1tYXJ5KGluZl9pZGVvX3R5cF9tb2QpJGZzdGF0aXN0aWNbMl0sIDApYCwgYHIgZm9ybWEoc3VtbWFyeShpbmZfaWRlb190eXBfbW9kKSRmc3RhdGlzdGljWzNdLCAwKWApID0gYHIgZm9ybWEoc3VtbWFyeShpbmZfaWRlb190eXBfbW9kKSRmc3RhdGlzdGljWzFdLCBGQUxTRSlgLCBwID0gYHIgZm9ybXAocGYoc3VtbWFyeShpbmZfaWRlb190eXBfbW9kKSRmc3RhdGlzdGljWzFdLCBzdW1tYXJ5KGluZl9pZGVvX3R5cF9tb2QpJGZzdGF0aXN0aWNbMl0sIHN1bW1hcnkoaW5mX2lkZW9fdHlwX21vZCkkZnN0YXRpc3RpY1szXSwgbG93ZXIudGFpbCA9IEZBTFNFKSlgLCBSXjJeID0gYHIgZm9ybWEoc3VtbWFyeShpbmZfaWRlb190eXBfbW9kKSRyLnNxdWFyZWQsIEZBTFNFKWAuIFRoZSBtYWluIGVmZmVjdCB0eXBpY2FsaXR5IHdhcyBub3Qgc2lnbmlmaWNhbnQsIGIgPSBgciBpbmZfaWRlb190eXBfbW9kX2NvZWZzJGVzdGltYXRlWzJdYCwgU0UgPSBgciBpbmZfaWRlb190eXBfbW9kX2NvZWZzJFNFWzJdYCwgdChgciBmb3JtYShzdW1tYXJ5KGluZl9pZGVvX3R5cF9tb2QpJGZzdGF0aXN0aWNbM10sIDApYCkgPSBgciBpbmZfaWRlb190eXBfbW9kX2NvZWZzJHRbMl1gLCBgciBmb3JtcChpbmZfaWRlb190eXBfbW9kX2NvZWZzJHBbMl0pYC4gVGhlIG1haW4gZWZmZWN0IG9mIHRoZSB0eXBpY2FsaXR5IHJhdGluZyB3YXMgbm90IHNpZ25pZmljYW50LCBiID0gYHIgaW5mX2lkZW9fdHlwX21vZF9jb2VmcyRlc3RpbWF0ZVszXWAsIFNFID0gYHIgaW5mX2lkZW9fdHlwX21vZF9jb2VmcyRTRVszXWAsIHQoYHIgZm9ybWEoc3VtbWFyeShpbmZfaWRlb190eXBfbW9kKSRmc3RhdGlzdGljWzNdLCAwKWApID0gYHIgaW5mX2lkZW9fdHlwX21vZF9jb2VmcyR0WzNdYCwgYHIgZm9ybXAoaW5mX2lkZW9fdHlwX21vZF9jb2VmcyRwWzNdKWAuIExhc3RseSwgdGhlcmUgd2FzIG5vIHNpZ25pZmljYW50IGludGVyYWN0aW9uLCBiID0gYHIgaW5mX2lkZW9fdHlwX21vZF9jb2VmcyRlc3RpbWF0ZVs0XWAsIFNFID0gYHIgaW5mX2lkZW9fdHlwX21vZF9jb2VmcyRTRVs0XWAsIHQoYHIgZm9ybWEoc3VtbWFyeShpbmZfaWRlb190eXBfbW9kKSRmc3RhdGlzdGljWzNdLCAwKWApID0gYHIgaW5mX2lkZW9fdHlwX21vZF9jb2VmcyR0WzRdYCwgYHIgZm9ybXAoaW5mX2lkZW9fdHlwX21vZF9jb2VmcyRwWzRdKWAuCgojIyMgU3RlcmVvdHlwZSBQcm9iYWJpbGl0eSB7LnRhYnNldH0KYGBge3IgdGFyZ2V0IGluZmVyZW5jZSBpZGVvbG9naWNhbCBzdGVyZW9wcm9iIH4gdHlwaWNhbGl0eSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9CiMgSW5mZXJlbmNlIGRhdGEKaW5mX3N0ZXJlb3Byb2JfaWRlb19kYXQgPC0gZGF0ICU+JQogIGZpbHRlcihkaWFnbm9zdGljaXR5X2NvbXBvbmVudCA9PSAiU1RFUkVPUFJPQiIpICU+JQogIGZpbHRlcihjYXRlZ29yeV90eXBlID09ICJJREVPTE9HSUNBTCIpICU+JQogIGZpbHRlcihpdGVtX3R5cGUgPT0gInRhcmdldCIpCgojIERlc2NyaXB0aXZlcwppbmZfc3RlcmVvcHJvYl9pZGVvX2Rlc2MgPC0gaW5mX3N0ZXJlb3Byb2JfaWRlb19kYXQgJT4lCiAgZ3JvdXBfYnkodHlwaWNhbGl0eSkgJT4lCiAgZ2V0X3N1bW1hcnlfc3RhdHMoaW5mLCB0eXBlID0gIm1lYW5fc2QiKSAlPiUKICBtdXRhdGUoCiAgICBjaTk1X2xvdyA9IG1lYW4gLSAxLjk2ICogc2QgLyBzcXJ0KG4pLAogICAgY2k5NV91cHAgPSBtZWFuICsgMS45NiAqIHNkIC8gc3FydChuKSkKCiMgSW5kZXBlbmRlbnQgc2FtcGxlcyB0LXRlc3QKaW5mX3N0ZXJlb3Byb2JfaWRlb190IDwtIGluZl9zdGVyZW9wcm9iX2lkZW9fZGF0ICU+JQogIHRfdGVzdCgKICAgIGluZiB+IHR5cGljYWxpdHksCiAgICBhbHRlcm5hdGl2ZSA9ICJsZXNzIiwKICAgIHJlZi5ncm91cCA9ICJESVMiKSAlPiUKICBtdXRhdGUocCA9IGZvcm1wKHAsIHRleHQgPSBUUlVFKSwgZGYgPSBmb3JtYShkZiwgMiksCiAgICBzdGF0aXN0aWMgPSBmb3JtYShzdGF0aXN0aWMpKQoKIyBDb2hlbnMgZAppbmZfc3RlcmVvcHJvYl9pZGVvX2QgPC0gaW5mX3N0ZXJlb3Byb2JfaWRlb19kYXQgJT4lCiAgY29oZW5zX2QoaW5mIH4gdHlwaWNhbGl0eSwgcGFpcmVkID0gRkFMU0UpICU+JQogIHB1bGwoZWZmc2l6ZSkgJT4lCiAgZm9ybWEoKQoKIyBQcmludCB0LXRlc3QKaW5mX3N0ZXJlb3Byb2JfaWRlb19yZXBvcnQgPC0gcGFzdGUwKCJ0KCIsIGluZl9zdGVyZW9wcm9iX2lkZW9fdCRkZiwgIikgPSAiLAogIGluZl9zdGVyZW9wcm9iX2lkZW9fdCRzdGF0aXN0aWMsICIsICIsIGluZl9zdGVyZW9wcm9iX2lkZW9fdCRwLCAiLCBkID0gIiwKICBpbmZfc3RlcmVvcHJvYl9pZGVvX2QpCgojIEVYQ0xVREUgT1VUTElFUlMKaW5mX3N0ZXJlb3Byb2JfaWRlb19kYXRfZXggPC0gaW5mX3N0ZXJlb3Byb2JfaWRlb19kYXQgJT4lCiAgZmlsdGVyKGluZiA+PSA0MCkKCiMgRGVzY3JpcHRpdmVzCmluZl9zdGVyZW9wcm9iX2lkZW9fZXhfZGVzYyA8LSBpbmZfc3RlcmVvcHJvYl9pZGVvX2RhdF9leCAlPiUKICBncm91cF9ieSh0eXBpY2FsaXR5KSAlPiUKICBnZXRfc3VtbWFyeV9zdGF0cyhpbmYsIHR5cGUgPSAibWVhbl9zZCIpICU+JQogIG11dGF0ZSgKICAgIGNpOTVfbG93ID0gbWVhbiAtIDEuOTYgKiBzZCAvIHNxcnQobiksCiAgICBjaTk1X3VwcCA9IG1lYW4gKyAxLjk2ICogc2QgLyBzcXJ0KG4pKQoKIyBJbmRlcGVuZGVudCBzYW1wbGVzIHQtdGVzdAppbmZfc3RlcmVvcHJvYl9pZGVvX2V4X3QgPC0gaW5mX3N0ZXJlb3Byb2JfaWRlb19kYXRfZXggJT4lCiAgdF90ZXN0KAogICAgaW5mIH4gdHlwaWNhbGl0eSwKICAgIGFsdGVybmF0aXZlID0gImxlc3MiLAogICAgcmVmLmdyb3VwID0gIkRJUyIpICU+JQogIG11dGF0ZShwID0gZm9ybXAocCwgdGV4dCA9IFRSVUUpLCBkZiA9IGZvcm1hKGRmLCAyKSwKICAgIHN0YXRpc3RpYyA9IGZvcm1hKHN0YXRpc3RpYykpCgojIENvaGVucyBkCmluZl9zdGVyZW9wcm9iX2lkZW9fZXhfZCA8LSBpbmZfc3RlcmVvcHJvYl9pZGVvX2RhdF9leCAlPiUKICBjb2hlbnNfZChpbmYgfiB0eXBpY2FsaXR5LCBwYWlyZWQgPSBGQUxTRSkgJT4lCiAgcHVsbChlZmZzaXplKSAlPiUKICBmb3JtYSgpCgojIFByaW50IHQtdGVzdAppbmZfc3RlcmVvcHJvYl9pZGVvX2V4X3JlcG9ydCA8LSBwYXN0ZTAoInQoIiwgaW5mX3N0ZXJlb3Byb2JfaWRlb19leF90JGRmLCAiKSA9ICIsCiAgaW5mX3N0ZXJlb3Byb2JfaWRlb19leF90JHN0YXRpc3RpYywgIiwgIiwgaW5mX3N0ZXJlb3Byb2JfaWRlb19leF90JHAsICIsIGQgPSAiLAogIGluZl9zdGVyZW9wcm9iX2lkZW9fZXhfZCkKCiMgV0lMQ09YT04KIyBPbmUtc2lkZWQgV2lsY294b24gcmFuay1zdW0gdGVzdAppbmZfc3RlcmVvcHJvYl9pZGVvX3djeCA8LSBpbmZfc3RlcmVvcHJvYl9pZGVvX2RhdCAlPiUKICB3aWxjb3hfdGVzdCgKICAgIGluZiB+IHR5cGljYWxpdHksCiAgICBhbHRlcm5hdGl2ZSA9ICJsZXNzIiwKICAgIHJlZi5ncm91cCA9ICJESVMiKQoKIyBXaWxjb3hvbiBlZmZlY3Qgc2l6ZSByCmluZl9zdGVyZW9wcm9iX2lkZW9fd2N4X3IgPC0gaW5mX3N0ZXJlb3Byb2JfaWRlb19kYXQgJT4lCiAgd2lsY294X2VmZnNpemUoaW5mIH4gdHlwaWNhbGl0eSwKICByZWYuZ3JvdXAgPSAiRElTIikgJT4lCiAgcHVsbChlZmZzaXplKQoKIyBQcmludCB3aWxjb3hvbiB0ZXN0CmluZl9zdGVyZW9wcm9iX2lkZW9fd2N4X3JlcG9ydCA8LSBwYXN0ZTAoIlogPSAiLAogIGZvcm1hKGluZl9zdGVyZW9wcm9iX2lkZW9fd2N4X3IgKiBzcXJ0KG5yb3coaW5mX3N0ZXJlb3Byb2JfaWRlb19kYXQpIC8gMikpLAogICIsICIsIGZvcm1wKGluZl9zdGVyZW9wcm9iX2lkZW9fd2N4JHAsIFRSVUUpLAogICIsIHIgPSAiLCBmb3JtYShpbmZfc3RlcmVvcHJvYl9pZGVvX3djeF9yKSkKYGBgCgpUbyB0ZXN0IHRoZSBlZmZlY3Qgb2YgbWFuaXB1bGF0aW5nIHRoZSBzdGVyZW90eXBlIHByb2JhYmlsaXR5IGNvbXBvbmVudCBvZiBkaWFnbm9zdGljaXR5IG9uIGluZmVyZW5jZXMgb2YgcGFydGlzYW5zaGlwLCB3ZSBjb25kdWN0ZWQgYW4gZXhwbG9yYXRvcnkgaW5kZXBlbmRlbnQgc2FtcGxlcyB0LXRlc3QgY29tcGFyaW5nIHRhcmdldCBpbmZlcmVuY2VzIG9mIGlkZW9sb2dpY2FsIGNhdGVnb3JpZXMgaW4gdGhlIHN0ZXJlb3R5cGUtY29uZmlybWluZyBhbmQgc3RlcmVvdHlwZS1kaXNjb25maXJtaW5nIGNvbmRpdGlvbnMuIFRoZSB0YXJnZXQgaW5mZXJlbmNlcyBpbiB0aGUgZGlzY29uZmlybWluZyBjb25kaXRpb24gYHIgcmVwb3J0X2Rlc2MoaW5mX3N0ZXJlb3Byb2JfaWRlb19kZXNjLCAxKWAgd2VyZSBub3Qgc2lnbmlmaWNhbnRseSBsb3dlciB0aGFuIGluIHRoZSBzdGVyZW90eXBlLWNvbmZpcm1pbmcgY29uZGl0aW9uIGByIHJlcG9ydF9kZXNjKGluZl9zdGVyZW9wcm9iX2lkZW9fZGVzYywgMilgLCBgciBpbmZfc3RlcmVvcHJvYl9pZGVvX3JlcG9ydGAuIFRvIGludmVzdGlnYXRlIHdoZXRoZXIgdGhpcyB3YXMgZHVlIHRvIHN0YXRpc3RpY2FsIG91dGxpZXJzLCB3ZSBjb25kdWN0ZWQgYW5vdGhlciBpbmRlcGVuZGVudCBzYW1wbGVzIHQtdGVzdCBleGNsdWRpbmcgcGFydGljaXBhbnRzIHdpdGggdmFsdWVzIGJlbG93IDQwLiBBZnRlciBleGNsdXNpb24sIHRoZSBpbmZlcmVuY2VzIGluIHRoZSBkaXNjb25maXJtaW5nIGNvbmRpdGlvbiBgciByZXBvcnRfZGVzYyhpbmZfc3RlcmVvcHJvYl9pZGVvX2V4X2Rlc2MsIDEpYCB3ZXJlIHN0aWxsIG5vdCBzaWduaWZpY2FudGx5IGxvd2VyIHRoYW4gaW4gdGhlIGNvbmZpcm1pbmcgY29uZGl0aW9uIGByIHJlcG9ydF9kZXNjKGluZl9zdGVyZW9wcm9iX2lkZW9fZXhfZGVzYywgMilgLCBgciBpbmZfc3RlcmVvcHJvYl9pZGVvX2V4X3JlcG9ydGAuCgojIyMjIE91dGxpZXIgRGV0ZWN0aW9uCmBgYHtyIHRhcmdldCBpbmZlcmVuY2UgaWRlb2xvZ2ljYWwgc3RlcmVvcHJvYiB+IHR5cGljYWxpdHkgb3V0bGllciwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9CmluZl9zdGVyZW9wcm9iX2lkZW9fZGF0ICU+JQogIGdncGxvdCguLCBhZXModHlwaWNhbGl0eSwgaW5mKSkgKwogIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEpICsKICBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMikgKwogIGxhYnMoeCA9ICJUeXBpY2FsaXR5IiwgeSA9ICJJbmZlcmVuY2VzIikgKwogIHRoZW1lX2NzX3RhbGsoKQpgYGAKCiMjIyMgTXVsdGl2ZXJzZSBPdXRsaWVyIENvcnJlY3Rpb24KYGBge3IgdGFyZ2V0IGluZmVyZW5jZSBpZGVvbG9naWNhbCBzdGVyZW9wcm9iIH4gdHlwaWNhbGl0eSBtdWx0aXZlcnNlLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0KIyBMb29wIG92ZXIgYWxsIGNvbWJpbmF0aW9ucyBvZiBjdXRvZmZzIGFuZCB0cmFuc2Zvcm1hdGlvbnMKbXZfc3RlcmVvcHJvYl9pZGVvIDwtIGRhdGEuZnJhbWUoCiAgY3V0b2ZmID0gYygibm9uZSIsICJmaXhlZCAyMCIsICJmaXhlZCAzMCIsICJmaXhlZCA0MCIsCiAgICAiTWRuIMKxIDIuNSBJUVIiLCAiTWRuIMKxIDIuMCBJUVIiLCAiTWRuIMKxIDEuNSBJUVIiLCAiTWRuIMKxIDEuMCBJUVIiKSwKICBjdXRvZmZfdHlwZSA9IGMoImZpeGVkIiwgImZpeGVkIiwgImZpeGVkIiwgImZpeGVkIiwKICAgICJNZG4gwrEgSVFSIiwgIk1kbiDCsSBJUVIiLCAiTWRuIMKxIElRUiIsICJNZG4gwrEgSVFSIiksCiAgY3V0b2ZmX3ZhbHVlID0gYygwLCAyMCwgMzAsIDQwLCAyLjUsIDIuMCwgMS41LCAxLjApKQpmb3IgKGMgaW4gc2VxX2xlbihucm93KG12X3N0ZXJlb3Byb2JfaWRlbykpKSB7CiAgaWYgKG12X3N0ZXJlb3Byb2JfaWRlbyRjdXRvZmZfdHlwZVtjXSA9PSAiZml4ZWQiKSB7CiAgICBtdl9kYXQgPC0gaW5mX3N0ZXJlb3Byb2JfaWRlb19kYXQgJT4lCiAgICAgIGZpbHRlcihpbmYgPj0gbXZfc3RlcmVvcHJvYl9pZGVvJGN1dG9mZl92YWx1ZVtjXSkKICB9IGVsc2UgaWYgKG12X3N0ZXJlb3Byb2JfaWRlbyRjdXRvZmZfdHlwZVtjXSA9PSAiTWRuIMKxIElRUiIpIHsKICAgIG12X2RhdCA8LSBpbmZfc3RlcmVvcHJvYl9pZGVvX2RhdCAlPiUKICAgICAgZ3JvdXBfYnkodHlwaWNhbGl0eSkgJT4lCiAgICAgIGZpbHRlcighaXNfb3V0bGllcihpbmYsIGNvZWYgPSBtdl9zdGVyZW9wcm9iX2lkZW8kY3V0b2ZmX3ZhbHVlW2NdKSkgJT4lCiAgICAgIHVuZ3JvdXAoKQogIH0KICAjIEluZGVwZW5kZW50IHNhbXBsZXMgdC10ZXN0CiAgbXZfdCA8LSBtdl9kYXQgJT4lCiAgICB0X3Rlc3QoCiAgICAgIGluZiB+IHR5cGljYWxpdHksCiAgICAgIGFsdGVybmF0aXZlID0gImxlc3MiLAogICAgICByZWYuZ3JvdXAgPSAiRElTIikgJT4lCiAgICBtdXRhdGUocCA9IGZvcm1wKHAsIHRleHQgPSBGQUxTRSksIGRmID0gZm9ybWEoZGYsIDIpLAogICAgICBzdGF0aXN0aWMgPSBmb3JtYShzdGF0aXN0aWMpKQoKICAjIENvaGVucyBkCiAgbXZfZCA8LSBtdl9kYXQgJT4lCiAgICBjb2hlbnNfZChpbmYgfiB0eXBpY2FsaXR5KSAlPiUKICAgIHB1bGwoZWZmc2l6ZSkgJT4lCiAgICBmb3JtYSgpCgogICMgU2F2ZSB0ZXN0IHN0YXRpc3RpY3MgZm9yIGgxCiAgbXZfc3RlcmVvcHJvYl9pZGVvJGBuIGV4Y2x1ZGVkYFtjXSA8LQogICAgbnJvdyhpbmZfc3RlcmVvcHJvYl9pZGVvX2RhdCkgLSBucm93KG12X2RhdCkKICBtdl9zdGVyZW9wcm9iX2lkZW8kZGZbY10gPC0gbXZfdCRkZgogIG12X3N0ZXJlb3Byb2JfaWRlbyR0W2NdIDwtIG12X3Qkc3RhdGlzdGljCiAgbXZfc3RlcmVvcHJvYl9pZGVvJHBbY10gPC0gbXZfdCRwCiAgbXZfc3RlcmVvcHJvYl9pZGVvJGRbY10gPC0gbXZfZAp9CiMgUHJpbnQgbXVsdGl2ZXJzZSB0YWJsZQprbml0cjo6a2FibGUoc2VsZWN0KG12X3N0ZXJlb3Byb2JfaWRlbywgLWN1dG9mZl90eXBlLCAtIGN1dG9mZl92YWx1ZSksCiAgZm9ybWF0ID0gIm1hcmtkb3duIikKYGBgCgpUbyBpbnZlc3RpZ2F0ZSB0aGUgcm9idXN0bmVzcyBvZiB0aGUgZWZmZWN0IGFjcm9zcyB2YXJpb3VzIG91dGxpZXIgZXhjbHVzaW9uIGNyaXRlcmlhLCB3ZSBjb25kdWN0ZWQgYSBtdWx0aXZlcnNlIGFuYWx5c2lzLiBXZSBhZ2FpbiBwZXJmb3JtZWQgaW5kZXBlbmRlbnQgc2FtcGxlcyB0LXRlc3RzIGFjcm9zcyBzZXZlcmFsIGZpeGVkIGFuZCBkaXN0cmlidXRpb24tYmFzZWQgdGhyZXNob2xkcy4gVGhlIGVmZmVjdCB3YXMgbm90IHNpZ25pZmljYW50IGZvciBhbGwgb2YgdGhlIHNldmVuIHRocmVzaG9sZHMuIFRoZXNlIHJlc3VsdHMgc3VnZ2VzdCB0aGF0IG1hbmlwdWxhdGluZyB0aGUgc3RlcmVvdHlwZSBwcm9iYWJpbGl0eSBoYXMgbm8gZWZmZWN0IG9uIGluZmVyZW5jZXMgb2YgcGFydGlzYW5zaGlwLgoKIyMjIyBRUS1QbG90CmBgYHtyIHRhcmdldCBpbmZlcmVuY2UgaWRlb2xvZ2ljYWwgc3RlcmVvcHJvYiB+IHR5cGljYWxpdHkgcXEsIG1lc3NhZ2UgPSBGQUxTRX0KaW5mX3N0ZXJlb3Byb2JfaWRlb19kYXQgJT4lCiAgZ2dwbG90KC4sIGFlcyhzYW1wbGUgPSBpbmYpKSArCiAgbGFicyh4ID0gIlRoZW9yZXRpY2FsIHF1YW50aWxlcyIsIHkgPSAiRGF0YSBxdWFudGlsZXMiKSArCiAgc3RhdF9xcShjb2xvciA9ICIjMDAwMDAwIikgKwogIHN0YXRfcXFfbGluZShjb2xvciA9ICIjMDAwMDAwIikgKwogIGZhY2V0X2dyaWQofiB0eXBpY2FsaXR5LCBsYWJlbGxlciA9ICJsYWJlbF92YWx1ZSIpICsKICB0aGVtZV9jc190YWxrKCkKYGBgCgojIyMjIERlc2NyaXB0aXZlcwpgYGB7ciB0YXJnZXQgaW5mZXJlbmNlIGlkZW9sb2dpY2FsIHN0ZXJlb3Byb2IgfiB0eXBpY2FsaXR5IGRlc2NyaXB0aXZlc30Ka25pdHI6OmthYmxlKGluZl9zdGVyZW9wcm9iX2lkZW9fZGVzYywgZm9ybWF0ID0gIm1hcmtkb3duIikKYGBgCgojIyMjIEhpc3RvZ3JhbQpgYGB7ciB0YXJnZXQgaW5mZXJlbmNlIGlkZW9sb2dpY2FsIHN0ZXJlb3Byb2IgfiB0eXBpY2FsaXR5IGhpc3RvZ3JhbX0KaW5mX3N0ZXJlb3Byb2JfaWRlb19kYXQgJT4lCiAgbXV0YXRlKGluZl9iaW4gPSBjdXQoaW5mLAogICAgYnJlYWtzID0gOSwgbGFiZWxzID0gRkFMU0UsIGluY2x1ZGUubG93ZXN0ID0gVFJVRSkpICU+JQogIGdncGxvdCgpICsKICBnZW9tX2Jhcihwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHByZXNlcnZlID0gInNpbmdsZSIpLAogIGFlcyh4ID0gaW5mX2JpbiwgeSA9IGFmdGVyX3N0YXQocHJvcCksIGZpbGwgPSB0eXBpY2FsaXR5KSwKICAgIHdpZHRoID0gMC44KSArCiAgbGFicyh0aXRsZSA9ICJIaXN0b2dyYW1tIG9mIEluZmVyZW5jZSBTY29yZXMiLAogICAgeCA9ICJJbmZlcmVuY2UgU2NvcmVzIiwKICAgIHkgPSAiUHJvcG9ydGlvbiIsIGZpbGwgPSAiVHlwaWNhbGl0eSIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjODQ5QUI5IiwgIiM0NjUyNjMiKSkgKwogIHRoZW1lX2NzX3RhbGsoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKIyMjIyBEaWFnbm9zdGljaXR5IFNpbXVsYXRpb24KYGBge3IgZGlhZ25vc3RpY2l0eSBzaW11bGF0aW9uLCBmaWcuaGVpZ2h0ID0gMTh9CmRpYWcgPC0gZGF0YS5mcmFtZSgKICBwcm9ic0EgPSByZXAoc2VxKDAuMSwgMC45LCAwLjAyKSwgZWFjaCA9IDQxKSwKICBwcm9ic0IgPSByZXAoc2VxKDAuMSwgMC45LCAwLjAyKSwgdGltZXMgPSA0MSksCiAgYmFzZSA9IE5BLAogIGluY3JfY291bnRlciA9IE5BLAogIGRlY3Jfc3RlcmVvID0gTkEKICApICU+JQogIGZpbHRlcihwcm9ic0EgPj0gcHJvYnNCKQppbmNyIDwtIC4wNjMKCmZvciAoaSBpbiBzZXFfbGVuKG5yb3coZGlhZykpKSB7CiAgcHJvYkEgPC0gZGlhZyRwcm9ic0FbaV0KICBwcm9iQiA8LSBkaWFnJHByb2JzQltpXQogIGRpYWckYmFzZVtpXSA8LSBwcm9iQSAvIChwcm9iQSArIHByb2JCKQogIGRpYWckaW5jcl9jb3VudGVyW2ldIDwtIHByb2JBIC8gKHByb2JBICsgKHByb2JCICsgaW5jcikpCiAgZGlhZyRkZWNyX3N0ZXJlb1tpXSA8LSAocHJvYkEgLSBpbmNyKSAvICgocHJvYkEgLSBpbmNyKSArIHByb2JCKQp9CgpkaWFnX3AgPC0gZGlhZyAlPiUKICBtdXRhdGUoCiAgICBpbmNyX2NvdW50ZXJfZWZmZWN0ID0gYmFzZSAtIGluY3JfY291bnRlciwKICAgIGRlY3Jfc3RlcmVvX2VmZmVjdCA9IGJhc2UgLSBkZWNyX3N0ZXJlbykKCmxpYnJhcnkocGxvdDNEKQpwYXIobWZyb3cgPSBjKDIsIDEpKQpzY2F0dGVyM0QoeCA9IGRpYWdfcCRwcm9ic0EsIHkgPSBkaWFnX3AkcHJvYnNCLCB6ID0gZGlhZ19wJGRlY3Jfc3RlcmVvX2VmZmVjdCwKICBwY2ggPSAxNiwKICB4bGFiID0gIlN0ZXJlb3R5cGUgUHJvYmFiaWxpdHkiLAogIHlsYWIgPSAiQ291bnRlcnN0ZXJlb3R5cGUgUHJvYmFiaWxpdHkiLAogIHpsYWIgPSAiQ2hhbmdlIGluIERpYWdub3N0aWNpdHkiLAogIGNvbHZhciA9IGRpYWdfcCRiYXNlLAogIGNvbCA9IHJhbXAuY29sKGNvbCA9IGMoIiMyZDg1ZmYiLCAiIzI4ZWE5NiIpLCBuID0gMTAwLCBhbHBoYSA9IDEpLAogIG1haW4gPSAiQ2hhbmdlIGluIGRpYWdub3N0aWNpdHkgZHVlIHRvIGRlY3JlYXNpbmcgc3RlcmVvdHlwZSBwcm9iYWJpbGl0eSIpCnNjYXR0ZXIzRCh4ID0gZGlhZ19wJHByb2JzQiwgeSA9IGRpYWdfcCRwcm9ic0EsIHogPSBkaWFnX3AkaW5jcl9jb3VudGVyX2VmZmVjdCwKICBwY2ggPSAxNiwKICB4bGFiID0gIkNvdW50ZXJzdGVyZW90eXBlIFByb2JhYmlsaXR5IiwKICB5bGFiID0gIlN0ZXJlb3R5cGUgUHJvYmFiaWxpdHkiLAogIHpsYWIgPSAiQ2hhbmdlIGluIERpYWdub3N0aWNpdHkiLAogIGNvbHZhciA9IGRpYWdfcCRiYXNlLAogIGNvbCA9IHJhbXAuY29sKGNvbCA9IGMoIiMyZDg1ZmYiLCAiIzI4ZWE5NiIpLCBuID0gMTAwLCBhbHBoYSA9IDEpLAogIG1haW4gPSAiQ2hhbmdlIGluIGRpYWdub3N0aWNpdHkgZHVlIHRvIGluY3JlYXNpbmcgY291bnRlcnN0ZXJlb3R5cGUgcHJvYmFiaWxpdHkiKQoKZGlhZ19kYXQgPC0gZGF0ICU+JQogIGZpbHRlcihpdGVtX3R5cGUgPT0gInRhcmdldCIpICU+JQogIGZpbHRlcihpbmYgPj0gNDApCgojIEV4cG9ydCBkYXRhIGZvciBzaW11bGF0aW9uCiMgc2F2ZVJEUyhkaWFnX2RhdCwgIlByZXJlZ2lzdHJhdGlvbi9zaW1fZGF0LlJEUyIpCmBgYAoKRGVjcmVhc2luZyB0aGUgc3RlcmVvdHlwZSBwcm9iYWJpbGl0eSBsZWFkcyB0byBsYXJnZXIgZGVjcmVhc2VzIG9mIGRpYWdub3N0aWNpdHkgdGhlIHNtYWxsZXIgdGhlIHN0ZXJlb3R5cGUgcHJvYmFiaWxpdHkgYW5kIHRoZSBjbG9zZXIgdGhlIHR3byBwcm9iYWJpbGl0aWVzIGFyZSB0b2dldGhlci4gR2VuZXJhbGx5LCB0aGVzZSBhcmUgY2FzZXMgd2l0aCBsb3cgZGlhZ25vc3RpY2l0eS4gSW5jcmVhc2luZyB0aGUgY291bnRlcnN0ZXJlb3R5cGUgcHJvYmFiaWxpdHkgdGhlIG90aGVyIGhhbmQgbGVhZHMgdG8gbGFyZ2VyIGRlY3JlYXNlcyBvZiBkaWFnbm9zdGljaXR5IHRoZSBzbWFsbGVyIHRoZSBjb3VudGVyc3RlcmVvdHlwZSBwcm9iYWJpbGl0eSBhbmQgdGhlIGZ1cnRoZXIgdGhlIHR3byBwcm9iYWJpbGl0aWVzIGFyZSBhcGFydC4gR2VuZXJhbGx5IHRoZXNlIGFyZSBjYXNlcyB3aXRoIGhpZ2ggZGlhZ25vc3RpY2l0eS4gQXMgdGhlIG9waW5pb25zIHByZXNlbnRlZCBpbiB0aGUgY3VycmVudCBzdHVkeSBhcmUgaGlnaGx5IGRpYWdub3N0aWMsIGl0IHdvdWxkIGJlIGV4cGVjdGVkIG9uIGFjY291bnQgb2YgdGhlIGRpYWdub3N0aWNpdHkgZm9ybXVsYSwgdGhhdCBkZWNyZWFzaW5nIHRoZSBzdGVyZW90eXBlIHByb2JhYmlsaXR5IHByb2R1Y2VzIHNtYWxsZXIgZGVjcmVhc2UgaW4gZGlhZ25vc3RpY2l0eSBjb21wYXJlZCB0byBpbmNyZWFzaW5nIHRoZSBjb3VudGVyc3RlcmVvdHlwZSBwcm9iYWJpbGl0eS4KCiMjIExpa2FiaWxpdHkgCiMjIyBDYXRlZ29yeSBGaXQgKiBUeXBpY2FsaXR5IHsudGFic2V0fQpgYGB7ciBsaWthYmlsaXR5IH4gdGltZSAqIHR5cGljYWxpdHkgKiBjYXRlZ29yeV9maXQsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQojIFN0ZXJlb3R5cGUgZGF0YQpsaWtlX2RhdCA8LSBkYXQgJT4lCiAgc2VsZWN0KHN1YmplY3RfaWQsIHRhcmdldF9jYXRlZ29yeV9sYWJlbCwgdGFyZ2V0X2NhdGVnb3J5LAogICAgcGFydGlzYW5faWRlbnRpdHksIHBvbGl0aWNhbF9pZGVvbG9neSwKICAgIGNhdGVnb3J5X3R5cGUsIHR5cGljYWxpdHksIGlzc3VlLCBtYXRjaGVzKCJfbGlrZV8iKSkgJT4lCiAgdW5pcXVlKCkgJT4lCiAgIyBFeGNsdWRlIHBhcnRpY2lwYW50cyB3aG8gZ2F2ZSBzYW1lIHJhdGluZyBpbiBhbGwgbGlrYWJpbGl0eSByYXRpbmdzCiAgcm93d2lzZSgpICU+JQogIGZpbHRlcigKICAgICFhbGwoCiAgICAgIHQxX2xpa2Vfbm9udGFyZ2V0ID09IHQxX2xpa2VfdGFyZ2V0LAogICAgICB0MV9saWtlX3RhcmdldCA9PSB0Ml9saWtlX25vbnRhcmdldCwKICAgICAgdDJfbGlrZV9ub250YXJnZXQgPT0gdDJfbGlrZV90YXJnZXQpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgcGl2b3RfbG9uZ2VyKAogICAgY29scyA9IG1hdGNoZXMoIl9saWtlXyIpLAogICAgbmFtZXNfdG8gPSBjKCJ0aW1lIiwgIi52YWx1ZSIsICJwZXJzb24iKSwKICAgIG5hbWVzX3BhdHRlcm4gPSAiKFthLXowLTldKilfKGxpa2UpXyguKikiKSAlPiUKICBtdXRhdGUocGFydGljaXBhbnRfY2F0ZWdvcnkgPSBjYXNlX3doZW4oLmRlZmF1bHQgPSAiT1RIIiwKICAgIGNhdGVnb3J5X3R5cGUgPT0gIlBBUlRZIiAmCiAgICAgIHBhcnRpc2FuX2lkZW50aXR5ID09ICJJbmRlcGVuZGVudCIgfiAiSU5EIiwKICAgIGNhdGVnb3J5X3R5cGUgPT0gIlBBUlRZIiAmCiAgICAgIHBhcnRpc2FuX2lkZW50aXR5ID09ICJSZXB1YmxpY2FuIiB+ICJSRVAiLAogICAgY2F0ZWdvcnlfdHlwZSA9PSAiUEFSVFkiICYKICAgICAgcGFydGlzYW5faWRlbnRpdHkgPT0gIkRlbW9jcmF0IiB+ICJERU0iLAogICAgY2F0ZWdvcnlfdHlwZSA9PSAiSURFT0xPR0lDQUwiICYKICAgICAgKHBvbGl0aWNhbF9pZGVvbG9neSA8PSA2NSAmIHBvbGl0aWNhbF9pZGVvbG9neSA+PSAzNSkgfiAiTU9EIiwKICAgIGNhdGVnb3J5X3R5cGUgPT0gIklERU9MT0dJQ0FMIiAmCiAgICAgIChwb2xpdGljYWxfaWRlb2xvZ3kgPiA2NSkgfiAiTElCIiwKICAgIGNhdGVnb3J5X3R5cGUgPT0gIklERU9MT0dJQ0FMIiAmCiAgICAgIChwb2xpdGljYWxfaWRlb2xvZ3kgPCAzNSkgfiAiQ09OIikpICU+JQogIGZpbHRlcighcGFydGljaXBhbnRfY2F0ZWdvcnkgJWluJSBjKCJNT0QiLCAiSU5EIiwgIk9USCIpKSAlPiUKICBtdXRhdGUoY2F0ZWdvcnlfZml0ID0gYXMuZmFjdG9yKGlmZWxzZSgKICAgIHBhcnRpY2lwYW50X2NhdGVnb3J5ID09IHRhcmdldF9jYXRlZ29yeV9sYWJlbCwKICAgICJpbmdyb3VwIiwgIm91dGdyb3VwIikpKSAlPiUKICBmaWx0ZXIocGVyc29uID09ICJ0YXJnZXQiKQoKIyBEZXNjcmlwdGl2ZXMKbGlrZV9kZXNjIDwtIGxpa2VfZGF0ICU+JQogIGdyb3VwX2J5KGNhdGVnb3J5X2ZpdCwgdHlwaWNhbGl0eSwgdGltZSkgJT4lCiAgZ2V0X3N1bW1hcnlfc3RhdHMobGlrZSwgdHlwZSA9ICJtZWFuX3NkIikgJT4lCiAgbXV0YXRlKAogICAgY2k5NV9sb3cgPSBtZWFuIC0gMS45NiAqIHNkIC8gc3FydChuKSwKICAgIGNpOTVfdXBwID0gbWVhbiArIDEuOTYgKiBzZCAvIHNxcnQobikpCgojIFJ1biBBTk9WQQpsaWtlX21vZCA8LSBsaWtlX2RhdCAlPiUKICBhbm92YV90ZXN0KGR2ID0gbGlrZSwKICAgIHdpZCA9IHN1YmplY3RfaWQsCiAgICBlZmZlY3Quc2l6ZSA9ICJwZXMiLAogICAgd2l0aGluID0gdGltZSwKICAgIGJldHdlZW4gPSBjKGNhdGVnb3J5X2ZpdCwgdHlwaWNhbGl0eSkpICU+JQogIGFzX3RpYmJsZSgpICU+JQogIHJvd3dpc2UoKSAlPiUKICBtdXRhdGUoRiA9IGZvcm1hKGBGYCwgMiksIHAgPSBmb3JtcChwKSwgcGVzID0gZm9ybWEocGVzLCAzLCBGQUxTRSkpCmBgYAoKIyMjIyBPdXRsaWVyIERldGVjdGlvbgpgYGB7ciBsaWthYmlsaXR5IH4gdGltZSAqIHR5cGljYWxpdHkgKiBjYXRlZ29yeV9maXQgb3V0bGllciwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9Cmxpa2VfZGF0ICU+JQogIGdncGxvdCguLCBhZXModHlwaWNhbGl0eSwgbGlrZSwgY29sb3IgPSB0aW1lKSkgKwogIGZhY2V0X3dyYXAofiBjYXRlZ29yeV9maXQpICsKICBnZW9tX2JveHBsb3Qob3V0bGllci5zaGFwZSA9IE5BKSArCiAgZ2VvbV9wb2ludChwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcmRvZGdlKCkpICsKICBsYWJzKHggPSAiVHlwaWNhbGl0eSIsIHkgPSAiU3RlcmVvdHlwZSIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiIzg0OUFCOSIsICIjNDY1MjYzIikpICsKICB0aGVtZV9jc190YWxrKCkKYGBgCgojIyMjIFFRLVBsb3QKYGBge3IgbGlrYWJpbGl0eSB+IHRpbWUgKiB0eXBpY2FsaXR5ICogY2F0ZWdvcnlfZml0IHFxLCBtZXNzYWdlID0gRkFMU0V9Cmxpa2VfZGF0ICU+JQogIGdncGxvdCguLCBhZXMoc2FtcGxlID0gbGlrZSkpICsKICBsYWJzKHggPSAiVGhlb3JldGljYWwgcXVhbnRpbGVzIiwgeSA9ICJEYXRhIHF1YW50aWxlcyIpICsKICBzdGF0X3FxKGNvbG9yID0gIiMwMDAwMDAiKSArCiAgc3RhdF9xcV9saW5lKGNvbG9yID0gIiMwMDAwMDAiKSArCiAgZmFjZXRfZ3JpZChjYXRlZ29yeV9maXQgKiB0eXBpY2FsaXR5IH4gdGltZSwgbGFiZWxsZXIgPSAibGFiZWxfdmFsdWUiKSArCiAgdGhlbWVfY3NfdGFsaygpCmBgYAoKIyMjIyBEZXNjcmlwdGl2ZXMKYGBge3IgbGlrYWJpbGl0eSB+IHRpbWUgKiB0eXBpY2FsaXR5ICogY2F0ZWdvcnlfZml0IGRlc2NyaXB0aXZlc30Ka25pdHI6OmthYmxlKGxpa2VfZGVzYywgZm9ybWF0ID0gIm1hcmtkb3duIikKYGBgCgojIyMjIEFOT1ZBCmBgYHtyIGxpa2FiaWxpdHkgfiB0aW1lICogdHlwaWNhbGl0eSAqIGNhdGVnb3J5X2ZpdCBhbm92YX0Ka25pdHI6OmthYmxlKGxpa2VfbW9kLCBmb3JtYXQgPSAibWFya2Rvd24iKQpgYGAKCiMjIyMgSGlzdG9ncmFtCmBgYHtyIGxpa2FiaWxpdHkgfiB0aW1lICogdHlwaWNhbGl0eSAqIGNhdGVnb3J5X2ZpdCBoaXN0b2dyYW19Cmxpa2VfZGF0ICU+JQogIG11dGF0ZShsaWtlX2JpbiA9IGN1dChsaWtlLAogICAgYnJlYWtzID0gOSwgbGFiZWxzID0gRkFMU0UsIGluY2x1ZGUubG93ZXN0ID0gVFJVRSkpICU+JQogIGdncGxvdCgpICsKICBnZW9tX2Jhcihwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHByZXNlcnZlID0gInNpbmdsZSIpLAogIGFlcyh4ID0gbGlrZV9iaW4sIHkgPSBhZnRlcl9zdGF0KHByb3ApLCBmaWxsID0gdGltZSksIHdpZHRoID0gMC44KSArCiAgbGFicyh0aXRsZSA9ICJIaXN0b2dyYW1tIG9mIFN0ZXJlb3R5cGUgU2NvcmVzIiwKICAgIHggPSAiTGlrYWJpbGl0eSAoYmlubmVkKSIsCiAgICB5ID0gIlByb3BvcnRpb24iLCBmaWxsID0gIlRpbWUiKSArCiAgZmFjZXRfZ3JpZChjYXRlZ29yeV9maXQgfiB0eXBpY2FsaXR5LCBsYWJlbGxlciA9ICJsYWJlbF92YWx1ZSIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjODQ5QUI5IiwgIiM0NjUyNjMiKSkgKwogIHRoZW1lX2NzX3RhbGsoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCkpCmBgYA==